Object.GetHashCode Object.GetHashCode Object.GetHashCode Object.GetHashCode Method

Definition

Fungiert als die Standardhashfunktion.Serves as the default hash function.

public:
 virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

Gibt zurück

Ein Hashcode für das aktuelle Objekt.A hash code for the current object.

Beispiele

Eine der einfachsten Möglichkeiten, um einen Hashcode für einen numerischen Wert zu berechnen, die den gleichen oder einen kleineren Bereich als hat die Int32 Typ ist, einfach diesen Wert zurückgeben.One of the simplest ways to compute a hash code for a numeric value that has the same or a smaller range than the Int32 type is to simply return that value. Das folgende Beispiel zeigt eine solche Implementierung für eine Number Struktur.The following example shows such an implementation for a Number structure.

using System;

public struct Number
{
   private int n;

   public Number(int value)
   {
      n = value;
   }

   public int Value
   {
      get { return n; }
   }
   
   public override bool Equals(Object obj)
   {
      if (obj == null || ! (obj is Number)) 
         return false;
      else
         return n == ((Number) obj).n;
   }      
   
   public override int GetHashCode()
   {
      return n;
   }
   
   public override string ToString()
   {
      return n.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      for (int ctr = 0; ctr <= 9; ctr++) {
         int randomN = rnd.Next(Int32.MinValue, Int32.MaxValue);
         Number n = new Number(randomN);
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode());
      }   
   }
}
// The example displays output like the following:
//       n =   -634398368, hash code =   -634398368
//       n =   2136747730, hash code =   2136747730
//       n =  -1973417279, hash code =  -1973417279
//       n =   1101478715, hash code =   1101478715
//       n =   2078057429, hash code =   2078057429
//       n =   -334489950, hash code =   -334489950
//       n =    -68958230, hash code =    -68958230
//       n =   -379951485, hash code =   -379951485
//       n =    -31553685, hash code =    -31553685
//       n =   2105429592, hash code =   2105429592
Public Structure Number
   Private n As Integer

   Public Sub New(value As Integer)
      n = value
   End Sub

   Public ReadOnly Property Value As Integer
      Get
         Return n
      End Get
   End Property
   
   Public Overrides Function Equals(obj As Object) As Boolean
      If obj Is Nothing OrElse Not TypeOf obj Is Number Then
         Return False
      Else
         Return n = CType(obj, Number).n
      End If
   End Function      
   
   Public Overrides Function GetHashCode() As Integer
      Return n
   End Function
   
   Public Overrides Function ToString() As String
      Return n.ToString()
   End Function
End Structure

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      For ctr As Integer = 0 To 9
         Dim randomN As Integer = rnd.Next(Int32.MinValue, Int32.MaxValue)
         Dim n As New Number(randomN)
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode())
      Next
   End Sub
End Module
' The example displays output like the following:
'       n =   -634398368, hash code =   -634398368
'       n =   2136747730, hash code =   2136747730
'       n =  -1973417279, hash code =  -1973417279
'       n =   1101478715, hash code =   1101478715
'       n =   2078057429, hash code =   2078057429
'       n =   -334489950, hash code =   -334489950
'       n =    -68958230, hash code =    -68958230
'       n =   -379951485, hash code =   -379951485
'       n =    -31553685, hash code =    -31553685
'       n =   2105429592, hash code =   2105429592

In vielen Fällen hat einen Typ mehrere Datenfelder, die beim Generieren des Hashcodes teilnehmen kann.Frequently, a type has multiple data fields that can participate in generating the hash code. Eine Möglichkeit, einen Hashcode zu generieren, kombinieren diese Felder mit wird ein XOR (eXclusive OR) -Operation, wie im folgenden Beispiel gezeigt.One way to generate a hash code is to combine these fields using an XOR (eXclusive OR) operation, as shown in the following example.

using System;

// A type that represents a 2-D point.
public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (! (obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return x ^ y;
    } 
} 

public class Example
{
   public static void Main()
   {
      Point pt = new Point(5, 8);
      Console.WriteLine(pt.GetHashCode());
        
      pt = new Point(8, 5);
      Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       13
//       13
' A type that represents a 2-D point.
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return x Xor y
    End Function 
End Structure 

Public Module Example
   Public Sub Main() 
      Dim pt As New Point(5, 8)
      Console.WriteLine(pt.GetHashCode())
        
      pt = New Point(8, 5)
      Console.WriteLine(pt.GetHashCode())
   End Sub 
End Module   

Das vorherige Beispiel gibt den gleichen Hashcode für (n1, n2) und (n2, n1), und um weitere Konflikte als wünschenswert sind, generieren kann.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Eine Reihe von Lösungen sind verfügbar, sodass Hashcodes in diesen Fällen nicht identisch sind.A number of solutions are available so that hash codes in these cases are not identical. Eine besteht darin, den Hashcode des Zurückgeben einer Tuple -Objekt, das die Reihenfolge der einzelnen Felder entspricht.One is to return the hash code of a Tuple object that reflects the order of each field. Das folgende Beispiel zeigt eine mögliche Implementierung, die verwendet die Tuple<T1,T2> Klasse.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Beachten Sie jedoch, die den Leistungsaufwand von Instanziieren einer Tuple Objekt kann erhebliche Auswirkungen auf die gesamtleistung einer Anwendung, die große Anzahl von Objekten in Hashtabellen speichert.Note, though, that the performance overhead of instantiating a Tuple object may significantly impact the overall performance of an application that stores large numbers of objects in hash tables.

using System;

public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (!(obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return Tuple.Create(x, y).GetHashCode();
    } 
} 

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());
        
        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       173
//       269
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return Tuple.Create(x, y).GetHashCode()
    End Function 
End Structure 

Public Module Example
    Public Sub Main() 
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
    End Sub 
End Module         
' The example displays the following output:
'       173
'       269

Eine zweite alternative Lösung umfasst die Gewichtung der Hashcodes für die einzelnen durch die Links-Umstellung der Hashcodes von aufeinander folgenden Feldern von zwei oder mehr Bits.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. Optimal, anstatt verworfen wird, verschoben nach Bit 31 Bits umschließen soll, anstatt verworfen werden.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Da von der Left Shift-Operatoren in c# und Visual Basic Bits verworfen werden, dies ist erforderlich, erstellen eine linke UMSCHALT-Wrap-Methode wie folgt:Since bits are discarded by the left-shift operators in both C# and Visual Basic, this requires creating a left shift-and-wrap method like the following:

public int ShiftAndWrap(int value, int positions)
{
    positions = positions & 0x1F;
  
    // Save the existing bit pattern, but interpret it as an unsigned integer.
    uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
    // Preserve the bits to be discarded.
    uint wrapped = number >> (32 - positions);
    // Shift and wrap the discarded bits.
    return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
}
Public Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
   positions = positions And &h1F
   
   ' Save the existing bit pattern, but interpret it as an unsigned integer.
   Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
   ' Preserve the bits to be discarded.
   Dim wrapped AS UInteger = number >> (32 - positions)
   ' Shift and wrap the discarded bits.
   Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
End Function

Im folgenden Beispiel wird dann diese UMSCHALT-Wrap-Methode berechnet den Hashcode der Point Struktur, die in den vorherigen Beispielen verwendet.The following example then uses this shift-and-wrap method to compute the hash code of the Point structure used in the previous examples.

using System;

public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (!(obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return ShiftAndWrap(x.GetHashCode(), 2) ^ y.GetHashCode();
    } 
    
    private int ShiftAndWrap(int value, int positions)
    {
        positions = positions & 0x1F;
      
        // Save the existing bit pattern, but interpret it as an unsigned integer.
        uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
        // Preserve the bits to be discarded.
        uint wrapped = number >> (32 - positions);
        // Shift and wrap the discarded bits.
        return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
    }
} 

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());
        
        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       28
//       37 
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return ShiftAndWrap(x.GetHashCode(), 2) XOr y.GetHashCode()
    End Function 
    
    Private Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
        positions = positions And &h1F
      
        ' Save the existing bit pattern, but interpret it as an unsigned integer.
        Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
        ' Preserve the bits to be discarded.
        Dim wrapped AS UInteger = number >> (32 - positions)
        ' Shift and wrap the discarded bits.
        Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
    End Function
End Structure 

Module Example
   Public Sub Main()
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
   End Sub
End Module
' The example displays the following output:
'       28
'       37

Hinweise

Ein Hashcode ist ein numerischer Wert, der zum Einfügen und identifizieren ein Objekt in einer Auflistung hashbasierten wie z. B. die Dictionary<TKey,TValue> -Klasse, die Hashtable Klasse oder von abgeleiteten Typs der DictionaryBase Klasse.A hash code is a numeric value that is used to insert and identify an object in a hash-based collection such as the Dictionary<TKey,TValue> class, the Hashtable class, or a type derived from the DictionaryBase class. Die GetHashCode Methode enthält dieser Hashcode für Algorithmen, die schnelle Überprüfungen Objektgleichheit benötigen.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Hinweis

Informationen zur Verwendung von Hashcodes in Hashtabellen und einige zusätzliche Code Hashalgorithmen, finden Sie unter den Hashfunktion Eintrag in Wikipedia.For information about how hash codes are used in hash tables and for some additional hash code algorithms, see the Hash Function entry in Wikipedia.

Zwei Objekte gleich return Hashcodes, die gleich sind.Two objects that are equal return hash codes that are equal. Das Gegenteil ist jedoch nicht "true": gleich Hashcodes implizieren keine Objektgleichheit, da verschiedene (ungleich) Objekte identische Hashcodes verfügen können.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Darüber hinaus ist .NET Framework nicht die standardmäßige Implementierung des garantiert die GetHashCode -Methode, und der Wert, der diese Methode gibt unterscheiden zwischen .NET Framework-Versionen und Plattformen wie 32-Bit- und 64-Bit-Plattformen.Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET Framework versions and platforms, such as 32-bit and 64-bit platforms. Aus diesen Gründen verwenden Sie nicht die Standardimplementierung dieser Methode als eine eindeutige Objekt-ID für hashing zu.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Führen Sie die beiden aus diesem:Two consequences follow from this:

  • Sie sollten nicht davon ausgehen, dass gleich Hashcodes Objektgleichheit implizieren.You should not assume that equal hash codes imply object equality.

  • Sie sollten nie beibehalten oder einen Hashcode außerhalb der Anwendungsdomäne, in der es erstellt wurde, verwenden, da das gleiche Objekt über Anwendungsdomänen, Prozessen und Plattformen hash kann.You should never persist or use a hash code outside the application domain in which it was created, because the same object may hash across application domains, processes, and platforms.

Warnung

Ein Hashcode ist vorgesehen, für das effiziente Einfügen und Suche in Auflistungen, die auf eine Hash-Tabelle basieren.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Ein Hashcode ist kein permanente Wert.A hash code is not a permanent value. Aus diesem Grund:For this reason:

  • Serialisieren Sie Hashwerte für Code zu und speichern Sie sie in Datenbanken nicht.Do not serialize hash code values or store them in databases.
  • Verwenden Sie nicht den Hashcode als Schlüssel an, um ein Objekt über eine schlüsselgebundene Sammlung abzurufen.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Hashcodes werden nicht über Anwendungsdomänen oder Prozessen gesendet werden.Do not send hash codes across application domains or processes. In einigen Fällen können der Hashcodes pro Domäne pro Prozess oder pro Anwendung berechnet werden.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Verwenden Sie den Hash nicht anstelle eines Werts von einer kryptografischen Hashfunktion zurückgegeben wird, wenn Sie einen kryptographisch starken Hashwert benötigen.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Für kryptografische Hashes, verwenden Sie eine von abgeleitete Klasse die System.Security.Cryptography.HashAlgorithm oder System.Security.Cryptography.KeyedHashAlgorithm Klasse.For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • Testen Sie nicht auf Gleichheit Hashcodes zu bestimmen, ob zwei Objekte gleich sind.Do not test for equality of hash codes to determine whether two objects are equal. (Ungleich Objekte können identische Hashcodes haben.) Um auf Gleichheit zu testen, rufen Sie die ReferenceEquals oder Equals Methode.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

Die GetHashCode Methode kann von einem abgeleiteten Typ überschrieben werden.The GetHashCode method can be overridden by a derived type. Wenn GetHashCode wird nicht überschrieben, Hashcodes für Verweistypen berechnet werden, durch den Aufruf der Object.GetHashCode -Methode der Basisklasse, die berechnet einen Hashcode basierend auf ein Objekt in der Referenz; Weitere Informationen, finden Sie unter RuntimeHelpers.GetHashCode.If GetHashCode is not overridden, hash codes for reference types are computed by calling the Object.GetHashCode method of the base class, which computes a hash code based on an object's reference; for more information, see RuntimeHelpers.GetHashCode. Das heißt, zwei Objekte auf dem die ReferenceEquals Methodenrückgabe true haben identische Hashcodes.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Wenn Sie Werttypen nicht außer Kraft setzen GetHashCode, ValueType.GetHashCode Methode der Basisklasse verwendet Reflektion, um den Hashcode anhand der Werte der Felder des Typs zu berechnen.If value types do not override GetHashCode, the ValueType.GetHashCode method of the base class uses reflection to compute the hash code based on the values of the type's fields. Mit anderen Worten, müssen die Typen mit Werten, deren Felder gleiche Werte haben, gleich Hashcodes.In other words, value types whose fields have equal values have equal hash codes. Weitere Informationen zum Überschreiben der GetHashCode, finden Sie im Abschnitt "Hinweise zur Vererbung".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Warnung

Wenn Sie außer Kraft setzen der GetHashCode -Methode, Sie sollten auch überschreiben Equals, und umgekehrt.If you override the GetHashCode method, you should also override Equals, and vice versa. Wenn die überschriebene Equals Methodenrückgabe true beim sind zwei Objekte hinsichtlich ihrer Gleichheit, die überschriebene testen GetHashCode Methode muss den gleichen Wert für die beiden Objekte zurückgeben.If your overridden Equals method returns true when two objects are tested for equality, your overridden GetHashCode method must return the same value for the two objects.

Wenn ein Objekt, das in einer Hashtabelle als Schlüssel verwendet wird, keine geeignete Implementierung von bietet GetHashCode, Sie können einen Hashcode-Standardanbieter angeben, durch Angabe einer IEqualityComparer Implementierung, die eine der Überladungen der der Hashtable Klassenkonstruktor.If an object that is used as a key in a hash table does not provide a useful implementation of GetHashCode, you can specify a hash code provider by supplying an IEqualityComparer implementation to one of the overloads of the Hashtable class constructor.

Anmerkungen zu dieser von der Windows-RuntimeWindows RuntimeNotes for the Windows-RuntimeWindows Runtime

Beim Aufrufen der GetHashCode Methode einer Klasse in der Windows-RuntimeWindows Runtime, es ist das Standardverhalten für Klassen, die nicht außer Kraft setzen GetHashCode.When you call the GetHashCode method on a class in the Windows-RuntimeWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Dies ist Teil der Unterstützung von .NET Framework für die Windows-RuntimeWindows Runtime (finden Sie unter .NET Framework Unterstützung für Windows Store-Apps und Windows-Runtime).This is part of the support that the .NET Framework provides for the Windows-RuntimeWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). Klassen in der Windows-RuntimeWindows Runtime nicht erben Object, und derzeit nicht implementiert eine GetHashCode.Classes in the Windows-RuntimeWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Allerdings haben sie anscheinend ToString, Equals(Object), und GetHashCode Methoden ein, wenn Sie diese in Ihrem C#- oder Visual Basic-Code verwenden und .NET Framework das Standardverhalten für diese Methoden ist.However, they appear to have ToString, Equals(Object), and GetHashCode methods when you use them in your C# or Visual Basic code, and the .NET Framework provides the default behavior for these methods.

Hinweis

Windows-RuntimeWindows Runtime Klassen, die in c# oder Visual Basic geschrieben sind, können außer Kraft setzen der GetHashCode Methode.classes that are written in C# or Visual Basic can override the GetHashCode method.

Hinweise für Vererber

Eine Hashfunktion wird verwendet, um eine Zahl (Hashcode) schnell zu generieren, die den Wert eines Objekts entspricht.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Hash-Funktionen sind für jeden Typ in der Regel spezifisch und Eindeutigkeit, müssen mindestens eines der Instanzfelder als Eingabe verwenden.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Hashcodes sollten nicht mit den Werten von statischen Feldern berechnet werden.Hash codes should not be computed by using the values of static fields.

Für die abgeleitete Klassen von Object, GetHashCode Delegatmethode können auf die Basisklasse GetHashCode() Implementierung nur dann, wenn die abgeleitete Klasse auf Gleichheit als Verweisgleichheit definiert.For classes derived from Object, the GetHashCode method can delegate to the base class GetHashCode() implementation only if the derived class defines equality to be reference equality. Die standardmäßige Implementierung des GetHashCode() zu Referenzzwecken Typen zurückgibt einen Hashcode, der zurückgegeben werden, indem Sie entspricht der GetHashCode(Object) Methode.The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. Sie können außer Kraft setzen GetHashCode() für unveränderliche Verweistypen.You can override GetHashCode() for immutable reference types. Im Allgemeinen für änderbare Referenztypen, Sie sollten eine Überschreibung GetHashCode() nur, wenn:In general, for mutable reference types, you should override GetHashCode() only if: – Sie können den Hashcode aus Feldern berechnen, die nicht änderbar sind; oder- You can compute the hash code from fields that are not mutable; or – Sie können sicherstellen, dass es sich bei der Hashcode des ein änderbares Objekt nicht geändert wird, während das Objekt in einer Auflistung enthalten ist, die dessen Hashcode verwendet.- You can ensure that the hash code of a mutable object does not change while the object is contained in a collection that relies on its hash code.

Andernfalls könnte man denken, dass die änderbare Objekt in der Hashtabelle verloren geht.Otherwise, you might think that the mutable object is lost in the hash table. Wenn Sie außer Kraft setzen möchten, führen Sie GetHashCode() für einen änderbaren Referenztyp, der Dokumentation sollte es machen, klar, dass Benutzer des Typs Objektwerte nicht ändern sollten, während das Objekt in einer Hashtabelle gespeichert ist.If you do choose to override GetHashCode() for a mutable reference type, your documentation should make it clear that users of your type should not modify object values while the object is stored in a hash table.

Bei Werttypen GetHashCode() Hash-Code stellt eine Standardimplementierung bereit, der Reflektion verwendet.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Sie sollten erwägen, überschreiben sie für eine bessere Leistung.You should consider overriding it for better performance.

Weitere Informationen und Beispiele, die Hashcodes in einer Vielzahl von Möglichkeiten zu berechnen, finden Sie unter dem Abschnitt "Beispiele".For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Eine Hashfunktion muss die folgenden Eigenschaften verfügen:A hash function must have the following properties: – Wenn zwei Objekte als gleich verglichen werden soll. die GetHashCode() Methode für jedes Objekt muss den gleichen Wert zurückgeben.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Jedoch, wenn zwei Objekte nicht als gleich verglichen werden die GetHashCode() Methoden für die beiden Objekte keine unterschiedliche Werte zurückgeben.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values.

– Die GetHashCode() -Methode für ein Objekt muss immer zurückgeben, die gleichen hash-Code so lange keine Änderung des Objektzustands, der den Rückgabewert des Objekts bestimmt System.Object.Equals Methode.- The GetHashCode() method for an object must consistently return the same hash code as long as there is no modification to the object state that determines the return value of the object's System.Object.Equals method. Beachten Sie, dass es sich bei "true" nur für die aktuelle Ausführung einer Anwendung und ein anderen Hash-Code zurückgegeben werden kann, wenn die Anwendung erneut ausgeführt wird.Note that this is true only for the current execution of an application, and that a different hash code can be returned if the application is run again.

– Für die optimale Leistung sollte eine Hash-Funktion generieren eine gleichmäßige Verteilung für alle Eingaben, einschließlich Eingabe, die stark gruppiert ist.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Ein Folge ist, dass kleinere Änderungen an den Objektstatus zu große Änderungen an der resultierende Hashcode für eine optimale Leistung der Hash-Tabelle führen soll.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance.

-Hashfunktionen sollte wenig Aufwand zu berechnen.- Hash functions should be inexpensive to compute.

– Die GetHashCode() Methode sollte keine Ausnahmen auslösen.- The GetHashCode() method should not throw exceptions.

Z. B. die Implementierung von der GetHashCode() Methode bereitgestellt wird, durch die String -Klasse gibt identische Hashcodes für identische Zeichenfolgenwerte zurück.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Aus diesem Grund zwei String Objekte den gleichen Hashcode zurückgeben, wenn sie den gleichen Zeichenfolgenwert darstellt.Therefore, two String objects return the same hash code if they represent the same string value. Die Methode verwendet außerdem alle Zeichen in der Zeichenfolge um verhältnismäßig zufällig verteilte Ausgabe zu generieren, selbst wenn die Eingabe in bestimmten Bereichen gruppiert ist (z. B. möglicherweise viele Benutzer Zeichenfolgen, die nur die unteren 128 ASCII-Zeichen, obwohl enthalten ein Zeichenfolge kann die 65.535 Unicode-Zeichen enthalten).Also, the method uses all the characters in the string to generate reasonably randomly distributed output, even when the input is clustered in certain ranges (for example, many users might have strings that contain only the lower 128 ASCII characters, even though a string can contain any of the 65,535 Unicode characters).

Bereitstellen einer guten Hashfunktion für eine Klasse kann sich erheblich auf die Leistung des Hinzufügens von diesen Objekten in eine Hashtabelle beeinträchtigen.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. In einer Hashtabelle mit Schlüsseln, die einer guten einer Hashfunktion Implementierung, dauert sucht nach einem Element Konstanten Zeit (z. B. eine o(1)-Operation) aus.In a hash table with keys that provide a good implementation of a hash function, searching for an element takes constant time (for example, an O(1) operation). In einer Hashtabelle mit einer schlechten Implementierung einer Hashfunktion, die Leistung einer Suche hängt die Anzahl der Elemente in der Hashtabelle (z. B. eine O (n)-Vorgang, in denen n ist die Anzahl der Elemente in der Hashtabelle).In a hash table with a poor implementation of a hash function, the performance of a search depends on the number of items in the hash table (for example, an O(n) operation, where n is the number of items in the hash table). Ein böswilliger Benutzer kann Daten einzugeben, die die Anzahl der Konflikte, vergrößert die erheblich die Leistung der Anwendung beeinträchtigen können, von die Hashtabellen, unter den folgenden Bedingungen abhängig:A malicious user can input data that increases the number of collisions, which can significantly degrade the performance of applications that depend on hash tables, under the following conditions: – Wenn Hashfunktionen häufige Konflikten führen.- When hash functions produce frequent collisions.

– Wenn ein Großteil der Objekte in einer Hashtabelle zum Erstellen der Hashcodes, die gleich sind oder anderen ungefähr gleich.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another.

– Wenn Benutzer die Daten eingeben, anhand, die derer der Hashcode berechnet wird.- When users input the data from which the hash code is computed.

Abgeleitete Klassen, die außer Kraft setzen GetHashCode() müssen auch überschreiben Equals(Object) um sicherzustellen, dass zwei Objekte als gleich betrachtet, die den gleichen Hashcode haben, andernfalls die Hashtable Typ funktioniert möglicherweise nicht ordnungsgemäß.Derived classes that override GetHashCode() must also override Equals(Object) to guarantee that two objects considered equal have the same hash code; otherwise, the Hashtable type might not work correctly.

Gilt für:

Siehe auch