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

Definicja

Służy jako domyślnej funkcji skrótu.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

Zwraca

Kod skrótu bieżącego obiektu.A hash code for the current object.

Przykłady

Jedną z najprostszych sposobów obliczyć wartość skrótu dla wartość liczbowa, która ma taką samą lub mniejszym zakresie niż Int32 typu jest po prostu zwraca tę wartość.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. W poniższym przykładzie pokazano implementację dla Number struktury.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

Często typ ma wiele pól danych, które mogą należeć do generowania kodu wyznaczania wartości skrótu.Frequently, a type has multiple data fields that can participate in generating the hash code. Jednym ze sposobów, aby wygenerować wartość skrótu jest połączyć te pola w programie XOR (eXclusive OR) operacji, jak pokazano w poniższym przykładzie.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   

Poprzedni przykład zwraca tę samą wartość skrótu dla (n1, n2) i (n2 n1), a więc może generować kolizji więcej niż jest to pożądane.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Dostępnych jest kilka rozwiązań, tak, aby kody skrótów w takiej sytuacji nie są identyczne.A number of solutions are available so that hash codes in these cases are not identical. Jeden jest przywrócenie skrótu Tuple obiekt, który odzwierciedla kolejność każdego pola.One is to return the hash code of a Tuple object that reflects the order of each field. W poniższym przykładzie pokazano możliwą implementację, która używa Tuple<T1,T2> klasy.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Pamiętaj jednak, obciążenie związane z wystąpienia Tuple obiektu znacznie może mieć wpływ na ogólną wydajność aplikacji, która przechowuje dużą liczbę obiektów w tabelach wyznaczania wartości skrótu.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

Drugie rozwiązanie alternatywne obejmuje wagi kody skrótów poszczególnych przez po lewej stronie przesunięcie kody skrótów kolejnych pól za pomocą liczby bitów dwóch lub więcej.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. Optymalnie zamiast zostanie odrzucony, bity przesunięte poza bit 31 zawijania wokół zamiast odrzucone.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Ponieważ bity są odrzucane przez operatorów przesunięcia w lewo w językach C# i Visual Basic, wymaga to tworzenia po lewej stronie metoda shift i zawijania podobne do następującego: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

W poniższym przykładzie użyto następnie ta metoda shift i zawijania do obliczenia kodu wartości skrótu Point struktury używanych w poprzednich przykładach.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

Uwagi

Wartość skrótu jest wartością liczbową, który służy do wstawiania i zidentyfikować obiektu w kolekcji bazujących na skrótach, takich jak Dictionary<TKey,TValue> klasy Hashtable klasy lub typ pochodzący od DictionaryBase klasy.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. GetHashCode Metoda udostępnia ten kod skrótu dla algorytmów, wymagających szybkiej kontroli równość obiektu.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Uwaga

Aby uzyskać informacje o używaniu kody skrótów w tabelach wyznaczania wartości skrótu i niektóre dodatkowe kod skrótu, zobacz funkcji skrótu wpisu w witrynie 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.

Dwa obiekty, które są równe zwracany skrótu, które są równe.Two objects that are equal return hash codes that are equal. Jednakże, odwrotna sytuacja nie jest wartość true: kody skrótów równy oznacza równość obiektu, ponieważ różnych obiektów (nierówne) mogą mieć identycznych skrótu.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Ponadto .NET nie gwarantuje domyślna Implementacja klasy GetHashCode metody i wartości, Metoda ta zwraca mogą się różnić od implementacji .NET, takich jak różne wersje programu .NET Framework i .NET Core i platformach, takich jak 32-bitowe i 64-bitowych platform.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. Z tego względu nie należy używać Domyślna implementacja tej metody jako identyfikator obiektu unikatowe potrzeby wyznaczania wartości skrótu.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Dwie konsekwencje postępuj zgodnie z tym:Two consequences follow from this:

  • Nie należy zakładać, że kody mieszania równy implikują równość obiektu.You should not assume that equal hash codes imply object equality.

  • Nigdy nie należy utrwalić lub użyć skrótu spoza domeny aplikacji, w której został utworzony, ponieważ ten sam obiekt może wyznaczania wartości skrótu w domenach aplikacji, procesy i platform.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.

Ostrzeżenie

Wartość skrótu jest przeznaczona dla wydajne wstawiania i lookup w kolekcji, które są oparte na tabelę mieszania.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Wartość skrótu nie jest stałe wartości.A hash code is not a permanent value. Z tego powodu:For this reason:

  • Nie serializacji wartości Kod skrótu lub przechowywać je w bazach danych.Do not serialize hash code values or store them in databases.
  • Nie należy używać skrótu jako klucza można pobrać obiektu z kluczem kolekcji.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Nie wysyłaj kody skrótów między domenami aplikacji lub procesów.Do not send hash codes across application domains or processes. W niektórych przypadkach kody skrótów mogą być obliczone na podstawie domeny na proces lub poszczególnych aplikacji.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Nie należy używać skrótu zamiast wartości zwracane przez kryptograficznych funkcji skrótu, jeśli potrzebujesz silną kryptograficznie wyznaczania wartości skrótu.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Klasy pochodzącej od użytku skróty kryptograficzne System.Security.Cryptography.HashAlgorithm lub System.Security.Cryptography.KeyedHashAlgorithm klasy.For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • Nie należy testować pod kątem równości kodów wartości skrótu, aby ustalić, czy dwa obiekty są takie same.Do not test for equality of hash codes to determine whether two objects are equal. (Nierówne obiekty mogą mieć identycznych skrótu). Aby przetestować pod kątem równości, należy wywołać ReferenceEquals lub Equals metody.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

GetHashCode Metoda może być zastąpiona przez typ pochodny.The GetHashCode method can be overridden by a derived type. Jeśli GetHashCode jest nie ich nadpisano, kody skrótów dla typów referencyjnych są obliczane przez wywołanie metody Object.GetHashCode metoda klasy bazowej, które oblicza wartość skrótu oparta na odwołanie do obiektu; Aby uzyskać więcej informacji, zobacz 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. Innymi słowy, dwóch obiektów, dla których ReferenceEquals metoda zwraca true mają identyczne skrótu.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. W przypadku typów wartości nie zastępują GetHashCode, ValueType.GetHashCode metody klasy bazowej używa odbicia, aby obliczyć wartość skrótu na podstawie wartości pól typu.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. Innymi słowy typy wartości, których pola mają równe wartości mają równe skrótu.In other words, value types whose fields have equal values have equal hash codes. Aby uzyskać więcej informacji o zastępowanie GetHashCode, zobacz sekcję "Uwagi dotyczące dziedziczenia".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Ostrzeżenie

Jeśli zastąpisz GetHashCode metody, należy również zastąpić Equalsi na odwrót.If you override the GetHashCode method, you should also override Equals, and vice versa. Jeśli Twoje zastąpione Equals metoda zwraca true po dwa obiekty są sprawdzane pod kątem równości, Twoje zastąpione GetHashCode metoda musi zwracać taką samą wartość dla dwóch obiektów.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.

Jeśli obiekt, który jest używany jako klucz w tabeli wyznaczania wartości skrótu nie udostępnia przydatne implementacji GetHashCode, można określić dostawcy kodu wyznaczania wartości skrótu, podając IEqualityComparer implementacji do jednego z przeciążeń Hashtable konstruktora klasy.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.

Uwagi dla Środowisko wykonawcze systemu WindowsWindows RuntimeNotes for the Środowisko wykonawcze systemu WindowsWindows Runtime

Gdy wywołujesz GetHashCode metody w klasie w Środowisko wykonawcze systemu WindowsWindows Runtime, zapewnia domyślne zachowanie dla klas, które nie zastąpisz GetHashCode.When you call the GetHashCode method on a class in the Środowisko wykonawcze systemu WindowsWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Jest to część obsługi, która oferuje funkcje programu .NET Framework Środowisko wykonawcze systemu WindowsWindows Runtime (zobacz .NET Framework obsługuje for Windows Store Apps i środowiska wykonawczego Windows).This is part of the support that the .NET Framework provides for the Środowisko wykonawcze systemu WindowsWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). Klasy w Środowisko wykonawcze systemu WindowsWindows Runtime nie dziedziczą Object, a aktualnie nie implementują GetHashCode.Classes in the Środowisko wykonawcze systemu WindowsWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Jednak wydają się mieć ToString, Equals(Object), i GetHashCode metody, gdy będziesz ich używać w kodzie języka C# lub Visual Basic a .NET Framework zapewnia domyślne zachowanie dla tych metod.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.

Uwaga

Środowisko wykonawcze systemu WindowsWindows Runtime klasy, które zostały napisane w języku C# lub Visual Basic można zastąpić GetHashCode metody.classes that are written in C# or Visual Basic can override the GetHashCode method.

Uwagi dotyczące dziedziczenia

Funkcję mieszania umożliwia szybkie generowanie numer (skrótu), która odpowiada wartości obiektu.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Funkcje wyznaczania wartości skrótu są zazwyczaj specyficzne dla każdego typu i aby zapewnić unikatowość, należy użyć co najmniej jedno z pól wystąpienia jako dane wejściowe.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Kody skrótów nie powinien można obliczyć przy użyciu wartości pola statyczne.Hash codes should not be computed by using the values of static fields.

Dla klasy pochodne Object, GetHashCode delegować metody do klasy bazowej GetHashCode() implementację tylko wtedy, gdy klasa pochodna definiuje równości jako równości odwołań.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. Domyślna implementacja klasy GetHashCode() dla odwołania do typów zwraca wartość skrótu, który jest odpowiednikiem ten, który został zwrócony przez GetHashCode(Object) metody.The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. Można zastąpić GetHashCode() dla typów odwołań niezmienne.You can override GetHashCode() for immutable reference types. Ogólnie rzecz biorąc, aby uzyskać modyfikowalnych typów referencyjnych, należy zastąpić GetHashCode() tylko wtedy, gdy:In general, for mutable reference types, you should override GetHashCode() only if: — Można obliczyć skrótu z pól, które nie są modyfikowalną; lub- You can compute the hash code from fields that are not mutable; or — Można zagwarantować, że wartość skrótu dla obiektu modyfikowalnego nie zmienia się, gdy obiekt jest zawarty w kolekcji, która zależy od jego kod skrótu.- 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.

W przeciwnym razie może się wydawać, że w tabeli wyznaczania wartości skrótu są tracone obiektu modyfikowalnego.Otherwise, you might think that the mutable object is lost in the hash table. Jeśli chcesz przesłonić GetHashCode() dla modyfikowalnego typu referencyjnego, z dokumentacją powinien ułatwiają Wyczyść, że użytkownicy tego typu nie należy modyfikować wartości obiektu, gdy obiekt jest przechowywany w tabeli wyznaczania wartości skrótu.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.

Dla typów wartości GetHashCode() udostępnia domyślną implementację kodu wyznaczania wartości skrótu, który używa odbicia.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Należy rozważyć przesłanianie go w celu zapewnienia lepszej wydajności.You should consider overriding it for better performance.

Aby uzyskać więcej informacji i przykładów, które może obliczyć kodów skrótu w na różne sposoby zobacz sekcję przykłady.For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Funkcja wyznaczania wartości skrótu musi mieć następujące właściwości:A hash function must have the following properties: — Jeśli dwa obiekty porównać jako równe, GetHashCode() metoda dla każdego obiektu musi zwrócić tę samą wartość.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Jednakże, jeśli dwa obiekty nie porównują jako równe, GetHashCode() metody dwa obiekty nie muszą zwracać różne wartości.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values.

GetHashCode() Metodę obiektu spójnie musi zwracać taki sam skrótu tak długo, jak nie ma żadnych modyfikacji stanu obiektu, który określa wartość zwracaną obiektu element System.Object.Equals metody.- 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. Należy pamiętać, że ta zasada obowiązuje tylko w przypadku wykonywania bieżącej aplikacji i że różnych skrótu mogą zostać zwrócone, jeśli aplikacja jest uruchamiana ponownie.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.

-Aby uzyskać najlepszą wydajność funkcja wyznaczania wartości skrótu powinien wygenerować równomiernego rozłożenia dla wszystkich danych wejściowych, włącznie z danych wejściowych, który jest w dużym stopniu klastrze.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Użycie tego możliwa jest niewielkie modyfikacje do stanu obiektu powinno spowodować duże modyfikacje wynikowy skrótu, aby uzyskać najlepszą wydajność tabeli wyznaczania wartości skrótu.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance.

— Funkcje skrótu powinny być tanie do obliczenia.- Hash functions should be inexpensive to compute.

GetHashCode() Metoda nie powinna zgłaszać wyjątków.- The GetHashCode() method should not throw exceptions.

Na przykład implementacji GetHashCode() metody dostarczone przez String Klasa zwraca kody skrótów identyczne dla identyczne ciągi.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. W związku z tym, dwa String obiektów zwraca tę samą wartość skrótu, jeśli stanowią one taką samą wartość ciągu.Therefore, two String objects return the same hash code if they represent the same string value. Ponadto metoda używa wszystkich znaków w ciągu do generowania rozsądnie losowo rozproszonych danych wyjściowych, nawet wtedy, gdy dane wejściowe działa w klastrze w określonych zakresach (na przykład wielu użytkowników może być ciągi, które zawierają tylko niższe 128 znaków ASCII, nawet jeśli ciąg może zawierać znaków Unicode 65 535).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).

Zapewnianie funkcji skrótu dobre dla klasy, można znacznie wpłynąć na wydajność dodanie tych obiektów do tabeli mieszania.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. W tabeli skrótów przy użyciu kluczy, które zapewniają dobrą implementację funkcji skrótu Wyszukiwanie elementu czasochłonne stałych (na przykład jest operacją O(1)).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). W tabeli wyznaczania wartości skrótu z niską implementację funkcji mieszania, wydajność wyszukiwania zależy od liczby elementów w tablicy skrótów (na przykład O (n) operacji, gdzie n jest liczba elementów w tablicy skrótów).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). Złośliwy użytkownik może wpisać danych, która zwiększa liczbę konfliktów, które mogłoby znacznie pogorszyć wydajność aplikacji, które są zależne od tabel skrótów, w następujących warunkach: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: — W przypadku funkcji mieszania powodować częste kolizji.- When hash functions produce frequent collisions.

— W przypadku duża część obiektów w tablicy skrótów generuje kody skrótów, które są równe lub około równa się ze sobą.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another.

— W przypadku użytkowników wprowadzania danych, z którego jest obliczana wartość skrótu.- When users input the data from which the hash code is computed.

Pochodne klasy, które zastępują GetHashCode() jest również przesłonięcie Equals(Object) celu zagwarantowania, że dwa obiekty uważane za równe mają tę samą wartość skrótu; w przeciwnym razie Hashtable typu mogą nie działać poprawnie.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.

Dotyczy

Zobacz też