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

Definition

Fungiert als 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, einen Hashcode für einen numerischen Wert zu berechnen, der denselben oder einen kleineren Bereich aufweist als der Int32 -Typ, besteht darin, diesen Wert einfach zurückzugeben.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

Häufig verfügt ein Typ über mehrere Datenfelder, die an der Erstellung des Hashcodes beteiligt sein können.Frequently, a type has multiple data fields that can participate in generating the hash code. Eine Möglichkeit, einen Hashcode zu generieren, besteht darin, diese Felder XOR (eXclusive OR) mithilfe eines-Vorgangs zu kombinieren, 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   

Im vorherigen Beispiel wird derselbe Hashcode für (N1, N2) und (N2, N1) zurückgegeben, sodass möglicherweise mehr Kollisionen generiert, als wünschenswert sind.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Es stehen eine Reihe von Lösungen zur Verfügung, 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 eines Tuple -Objekts zurückzugeben, das die Reihenfolge der einzelnen Felder widerspiegelt.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 die Tuple<T1,T2> -Klasse verwendet.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Beachten Sie jedoch, dass sich der Leistungs Aufwand beim Instanziieren Tuple eines-Objekts erheblich auf die Gesamtleistung einer Anwendung auswirken kann, in der eine große Anzahl von Objekten in Hash Tabellen gespeichert wird.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 besteht darin, die einzelnen Hashcodes zu gewichten, indem die Hashcodes aufeinander folgender Felder um zwei oder mehr Bits verschoben werden.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. Anstatt verworfen zu werden, sollten Bits, die über Bit 31 hinaus verschoben werden, umschlossen werden, anstatt verworfen zu werden.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Da Bits von den Left Shift-Operatoren sowohl C# in als auch Visual Basic verworfen werden, muss eine Left Shift-and-Wrap-Methode wie die folgende erstellt werden: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 Shift-and-Wrap-Methode verwendet, um den Hashcode der Point Struktur zu berechnen, die in den vorherigen Beispielen verwendet wurde.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 verwendet wird, um ein Objekt in einer Hash basierten Auflistung (z. b Dictionary<TKey,TValue> . die- Hashtable Klasse, die-Klasse oder einen von DictionaryBase der-Klasse abgeleiteten Typ) einzufügen und zu identifizieren.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 stellt diesen Hashcode für Algorithmen bereit, die schnelle Überprüfungen der Objekt Gleichheit 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 Hash Tabellen und einige zusätzliche Hash Code Algorithmen finden Sie im Eintrag Hash Function 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, die gleich sind, gleichmäßige Rückgabe Hashcodes sind gleich.Two objects that are equal return hash codes that are equal. Umgekehrt ist dies jedoch nicht der Fall: gleiche Hashcodes implizieren keine Objekt Gleichheit, da verschiedene (ungleich) Objekte identische Hashcodes aufweisen 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 garantiert .net nicht die Standard Implementierung GetHashCode der-Methode, und der von dieser Methode zurückgegebene Wert kann sich zwischen .net-Implementierungen unterscheiden, wie z. b. unterschiedlichen Versionen von .NET Framework und .net Core und Plattformen wie 32 Bit und 64-Bit-Plattformen.Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, and platforms, such as 32-bit and 64-bit platforms. Verwenden Sie aus diesen Gründen nicht die Standard Implementierung dieser Methode als eindeutigen Objekt Bezeichner für Hash Zwecke.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Es folgen zwei Konsequenzen:Two consequences follow from this:

  • Sie sollten nicht davon ausgehen, dass die gleichen Hashcodes Objekt Gleichheit implizieren.You should not assume that equal hash codes imply object equality.

  • Sie sollten niemals einen Hashcode außerhalb der Anwendungsdomäne beibehalten oder verwenden, in der er erstellt wurde, da das gleiche Objekt über Anwendungs Domänen, Prozesse und Plattformen hinweg einen Hash durchführen 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 für die effiziente Einfügung und Suche in Auflistungen vorgesehen, die auf einer 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 dauerhafter Wert.A hash code is not a permanent value. Aus diesem Grund:For this reason:

  • Serialisieren Sie keine Hash Code Werte, oder speichern Sie Sie nicht in Datenbanken.Do not serialize hash code values or store them in databases.
  • Verwenden Sie den Hashcode nicht als Schlüssel zum Abrufen eines Objekts aus einer Schlüssel gebundenen Auflistung.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Senden Sie keine Hashcodes über Anwendungs Domänen oder Prozesse hinweg.Do not send hash codes across application domains or processes. In einigen Fällen können Hashcodes pro Prozess oder pro Anwendungsdomäne berechnet werden.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Verwenden Sie nicht den Hashcode anstelle eines Werts, der von einer kryptografischen Hash Funktion zurückgegeben wird, wenn Sie einen kryptografisch starken Hash 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. Verwenden Sie für kryptografische Hashes eine Klasse, die von System.Security.Cryptography.HashAlgorithm der System.Security.Cryptography.KeyedHashAlgorithm -Klasse oder der-Klasse abgeleitet ist.For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • Testen Sie nicht auf Gleichheit von Hashcodes, um zu bestimmen, ob zwei Objekte gleich sind.Do not test for equality of hash codes to determine whether two objects are equal. (Ungleiche Objekte können identische Hashcodes aufweisen.) Um auf Gleichheit zu testen, müssen ReferenceEquals Sie Equals die-Methode oder die-Methode(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

Die GetHashCode Methode kann durch einen abgeleiteten Typ überschrieben werden.The GetHashCode method can be overridden by a derived type. Wenn GetHashCode nicht überschrieben wird, werden Hashcodes für Verweis Typen berechnet, indem die Object.GetHashCode -Methode der Basisklasse aufgerufen wird, die einen Hashcode auf der Grundlage eines Objekt Verweises berechnet. Weitere Informationen finden RuntimeHelpers.GetHashCodeSie unter.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. Mit anderen Worten, zwei Objekte, für die ReferenceEquals die Methode true zurückgibt, haben identische Hashcodes.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Wenn Werttypen nicht über GetHashCodeschreiben, ValueType.GetHashCode verwendet die-Methode der Basisklasse Reflektion, um den Hashcode basierend auf den Werten 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. Anders ausgedrückt: Werttypen, deren Felder gleich sind, haben gleiche Hashcodes.In other words, value types whose fields have equal values have equal hash codes. Weitere Informationen zum über GetHashCodeSchreiben von finden Sie im Abschnitt "Hinweise zu Vererbung".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Warnung

Wenn Sie die GetHashCode -Methode überschreiben, sollten Sie Equalsauch überschreiben und umgekehrt.If you override the GetHashCode method, you should also override Equals, and vice versa. Wenn die überschriebene Equals Methode true zurückgibt, wenn zwei Objekte auf Gleichheit getestet werden, GetHashCode muss die überschriebene Methode 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 als Schlüssel in einer Hash Tabelle verwendet wird, keine nützliche Implementierung von GetHashCodebereitstellt, können Sie einen Hashcode-Anbieter angeben, indem Sie eine IEqualityComparer -Implementierung für eine der über Ladungen Hashtable des-Klassenkonstruktors bereitstellen.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.

Hinweise zumWindows-RuntimeWindows RuntimeNotes for the Windows-RuntimeWindows Runtime

Wenn Sie die GetHashCode -Methode für eine Klasse in der Windows-RuntimeWindows Runtime-Klasse aufzurufen, wird das Standardverhalten für Klassen GetHashCodebereitstellt, die nicht überschreiben.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 ein Teil der Unterstützung, die der .NET Framework für Windows-RuntimeWindows Runtime bietet (siehe .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 erben Objectnicht GetHashCodeund implementieren derzeit nicht.Classes in the Windows-RuntimeWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Allerdings scheinen Sie die Methoden ToString, Equals(Object)und GetHashCode zu haben, wenn Sie Sie im- C# oder-Visual Basic Code verwenden, und die .NET Framework stellt das Standardverhalten für diese Methoden bereit.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 RuntimeKlassen, die in C# oder Visual Basic geschrieben sind, können GetHashCode die-Methode überschreiben.classes that are written in C# or Visual Basic can override the GetHashCode method.

Hinweise für Vererber

Eine Hash Funktion wird verwendet, um schnell eine Zahl (Hashcode) zu generieren, die dem 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 in der Regel für jeden Typ spezifisch und müssen aus Gründen der Eindeutigkeit 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 mithilfe der Werte statischer Felder berechnet werden.Hash codes should not be computed by using the values of static fields.

Bei Klassen, die Objectvon abgeleitet GetHashCode werden, kann die-Methode nur GetHashCode() an die Basisklassen Implementierung delegieren, wenn die abgeleitete Klasse Gleichheit als Verweis Gleichheit 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 Standard Implementierung von GetHashCode() für Verweis Typen gibt einen Hashcode zurück, der dem von der GetHashCode(Object) -Methode zurückgegebenen Hashcode entspricht.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 für GetHashCode() unveränderliche Verweis Typen überschreiben.You can override GetHashCode() for immutable reference types. Im Allgemeinen sollten Sie für änderbare Verweis Typen nur Folgendes über GetHashCode() schreiben:In general, for mutable reference types, you should override GetHashCode() only if: -Sie können den Hashcode aus Feldern berechnen, die nicht änderbar sind. noch- You can compute the hash code from fields that are not mutable; or -Sie können sicherstellen, dass sich der Hashcode eines änderbaren Objekts nicht ändert, während das Objekt in einer Auflistung enthalten ist, die auf seinem Hashcode basiert.- 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 denken Sie möglicherweise, dass das änderbare Objekt in der Hash Tabelle verloren geht.Otherwise, you might think that the mutable object is lost in the hash table. Wenn Sie für einen änderbaren GetHashCode() Referenztyp überschreiben möchten, sollte in der Dokumentation deutlich werden, dass die Benutzer des Typs Objektwerte nicht ändern sollten, während das Objekt in einer Hash Tabelle gespeichert wird.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.

Für Werttypen GetHashCode() stellt eine standardmäßige Hashcode-Implementierung bereit, die Reflektion verwendet.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Sie sollten diese überschreiben, um die Leistung zu verbessern.You should consider overriding it for better performance.


Weitere Informationen und Beispiele, in denen Hashcodes auf unterschiedlichste Weise berechnet werden, finden Sie im Abschnitt "Beispiele".For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Eine Hash Funktion muss über die folgenden Eigenschaften verfügen:A hash function must have the following properties: -Wenn zwei-Objekte als gleich verglichen werden GetHashCode() , muss die-Methode für jedes Objekt denselben Wert zurückgeben.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Wenn jedoch zwei-Objekte nicht als gleich verglichen werden, müssen GetHashCode() die Methoden für die beiden-Objekte keine anderen 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 den gleichen Hashcode immer wieder zurückgeben, solange keine Änderung des Objekt Zustands vorliegt, der den Rückgabewert der [System. Object. gleich](xref:System.Object.Equals*) -Methode des Objekts bestimmt.- 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](xref:System.Object.Equals*) method. Beachten Sie, dass dies nur für die aktuelle Ausführung einer Anwendung gilt und dass ein anderer Hashcode 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 eine optimale Leistung sollte eine Hash Funktion eine gleichmäßige Verteilung für alle Eingaben generieren, einschließlich der stark gruppierten Eingaben.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Dies impliziert, dass kleine Änderungen am Objektzustand zu großen Änderungen am resultierenden Hashcode führen sollten, um die beste Leistung der Hash Tabelle zu erzielen.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance. -Hash Funktionen sollten für die Berechnung günstig sein.- Hash functions should be inexpensive to compute. -Die GetHashCode() Methode sollte keine Ausnahmen auslösen.- The GetHashCode() method should not throw exceptions. Beispielsweise gibt die Implementierung GetHashCode() der-Methode, die von der String -Klasse bereitgestellt wird, identische Hashcodes für identische Zeichen folgen Werte zurück.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Daher geben zwei String -Objekte denselben Hashcode zurück, wenn Sie denselben Zeichen folgen Wert darstellen.Therefore, two String objects return the same hash code if they represent the same string value. Außerdem verwendet die-Methode alle Zeichen in der Zeichenfolge, um eine relativ zufällig verteilte Ausgabe zu generieren, auch wenn die Eingabe in bestimmten Bereichen gruppiert ist (z. b. können viele Benutzer Zeichen folgen haben, die nur die unteren 128 ASCII-Zeichen enthalten, auch wenn eine die Zeichenfolge kann jedes der 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). Das Bereitstellen einer guten Hash Funktion für eine Klasse kann die Leistung beim Hinzufügen dieser Objekte zu einer Hash Tabelle erheblich 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 Hash Tabelle mit Schlüsseln, die eine gute Implementierung einer Hash Funktion bereitstellen, benötigt das Suchen nach einem Element Konstante Zeit (z. b. ein O (1)-Vorgang).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 Hash Tabelle, bei der die Implementierung einer Hash Funktion unzureichend ist, hängt die Leistung einer Suche von der Anzahl der Elemente in der Hash Tabelle ab (z. b.`n`einem O () `n` -Vorgang, wobei die Anzahl der Elemente in der Hash Tabelle ist).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 eingeben, die die Anzahl der Konflikte erhöhen. Dies kann die Leistung von Anwendungen, die von Hash Tabellen abhängen, unter den folgenden Bedingungen erheblich beeinträchtigen: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 Hash Funktionen häufige Konflikte verursachen.- When hash functions produce frequent collisions. : Wenn ein großer Anteil von Objekten in einer Hash Tabelle Hashcodes erzeugt, die gleich oder ungefähr gleich zueinander sind.- 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, aus denen der Hashcode berechnet wird.- When users input the data from which the hash code is computed. Abgeleitete Klassen, GetHashCode() die überschreiben Equals(Object) , müssen auch überschreiben, um sicherzustellen, dass zwei Objekte, die als Hashtable gleich betrachtet werden, denselben Hashcode aufweisen. andernfalls funktioniert der Typ möglicherweise nichtDerived 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