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

Definice

Slouží jako výchozí funkce hash.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

Návraty

Hodnota hash pro aktuální objekt.A hash code for the current object.

Příklady

Jeden z nejjednodušších způsobů vypočítat hodnotu hash pro číselnou hodnotu, která má stejné nebo menší rozsah než Int32 typ má rovnou vrátit tuto hodnotu.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. Následující příklad ukazuje takový implementaci 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

Často typ má více datových polí, které mohl podílet na vytváření kódu hash.Frequently, a type has multiple data fields that can participate in generating the hash code. Jeden způsob, jak vygenerovat hash kód je kombinací těchto polí pomocí XOR (eXclusive OR) operace, jak je znázorněno v následujícím příkladu.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   

V předchozím příkladu vrátí stejnou hodnotu hash pro (n1, n2) a (n2 n1) a proto může způsobit další kolize, než je žádoucí.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Počet řešení jsou k dispozici, tak, aby kódů hash v těchto případech nejsou identické.A number of solutions are available so that hash codes in these cases are not identical. Jeden má návratový kód hash Tuple objekt, který zahrnuje pořadí jednotlivých polí.One is to return the hash code of a Tuple object that reflects the order of each field. Následující příklad ukazuje možnou implementaci, která používá Tuple<T1,T2> třídy.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Pamatujte však, který nároky na výkon pro vytváření instancí Tuple objekt může významně ovlivnit celkový výkon aplikace, která ukládá velkého počtu objektů v zatřiďovacích tabulek.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

Druhý alternativní řešení zahrnuje vážení jednotlivé hodnoty hash kódů vlevo zvolit kódů hash po sobě následujících polí ve dvou nebo více 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. Optimálně místo bude zahozen bits posunuta nad rámec bit 31 zalamován kolem spíše než zahodí.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Protože bity jsou zahozena operátory posunutí doleva v jazyce C# a Visual Basic, to vyžaduje vytvoření levý shift a wrap metody vypadat asi takto: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

Následující příklad poté použije tato metoda shift a wrap pro výpočet kódů hash Point struktury použité v předchozích příkladech.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

Poznámky

Hodnota hash je číselná hodnota, která slouží k vložení a identifikovat objekt v kolekci na základě hodnoty hash, jako Dictionary<TKey,TValue> třídy, Hashtable třídy nebo typ odvozený z DictionaryBase třídy.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 poskytuje kód hash pro algoritmy, které je třeba rychlé kontroly rovnosti objektu.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Poznámka

Informace o používání kódů hash v zatřiďovacích tabulek a některé další hashovacích algoritmů kódu najdete v tématu funkce Hash položku na wikipedii.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.

Dva objekty, které se rovná návratová hodnota hash kódy, které jsou si rovny.Two objects that are equal return hash codes that are equal. Ale, opak není pravdou: stejné hodnoty hash kódy nezahrnují rovnost objektů, protože různé objekty (nerovnost) mohou mít identické hash kódy.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Kromě toho .NET nezaručuje výchozí implementaci GetHashCode metoda a hodnotu, vrátí tato metoda se může lišit mezi platformami, jako je 32bitová verze a implementace .NET, jako je například různé verze rozhraní .NET Framework a .NET Core, a 64bitové platformy.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 těchto důvodů nepoužívejte výchozí implementace této metody jako identifikátor jedinečný objekt pro vytváření hodnoty hash účely.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Z toho postupujte podle dva důsledky:Two consequences follow from this:

  • By neměl předpokládají, že stejné hodnoty hash kódy implikují rovnost objektů.You should not assume that equal hash codes imply object equality.

  • Nikdy byste zachována nebo použít hodnotu hash mimo doménu aplikace, ve kterém byly vytvořeny, protože na stejný objekt mohou hash napříč doménami aplikace, procesy a platformy.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.

Varování

Hodnota hash je určená pro efektivní vkládání a vyhledávání v kolekcích, které jsou založeny na zatřiďovací tabulku.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Kód hash není hodnotou trvalé.A hash code is not a permanent value. Z tohoto důvodu:For this reason:

  • Serializaci hodnoty hash nebo uložit je do databáze.Do not serialize hash code values or store them in databases.
  • Nepoužívejte hodnotu hash jako klíč k načtení objektu z kolekce s klíči.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Neodesílejte kódů hash napříč doménami aplikace nebo procesy.Do not send hash codes across application domains or processes. V některých případech mohou být vypočítány hash kódy na základě domény na úrovni jednotlivého procesu nebo podle aplikace.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Místo hodnoty vrácené kryptografické funkce algoritmu hash, pokud potřebujete hodnoty hash kryptograficky silnou nepoužívejte hodnotu hash.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Kryptografické hodnoty hash, použijte třídu odvozenou z System.Security.Cryptography.HashAlgorithm nebo System.Security.Cryptography.KeyedHashAlgorithm třídy.For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • Neprovádějte testování rovnosti hodnoty hash kódů k určení, zda dva objekty rovnají.Do not test for equality of hash codes to determine whether two objects are equal. (Nerovnost objekty mohou mít identické hash kódy.) Chcete-li testovat rovnost, zavolejte ReferenceEquals nebo Equals metody.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

GetHashCode Metoda může být přepsána odvozeným typem.The GetHashCode method can be overridden by a derived type. Pokud GetHashCode je přepsána nebyla, hash kódy pro typy odkazů jsou vypočítány pomocí volání Object.GetHashCode metoda základní třídy, která vypočítá kód hash založena na odkaz objekt; Další informace naleznete v tématu 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. Jinými slovy, dva objekty, pro kterou ReferenceEquals vrátí metoda true mají stejné hodnoty hash kódy.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Pokud přepsána. typy hodnot GetHashCode, ValueType.GetHashCode metoda základní třídy pomocí reflexe vypočítat hodnotu hash na základě hodnot typu pole.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. Jinými slovy typy hodnot, jejichž pole mají stejné hodnoty mají stejné hodnoty hash kódy.In other words, value types whose fields have equal values have equal hash codes. Další informace o přepsání GetHashCode, najdete v části "Poznámky pro dědice".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Varování

Pokud přepíšete GetHashCode metoda, kterou byste měli také přepsat Equalsa naopak.If you override the GetHashCode method, you should also override Equals, and vice versa. Pokud vaše přepsané Equals vrátí metoda true při jsou dva objekty testování rovnosti, vaše přepsané GetHashCode metoda musí vrátit stejnou hodnotu pro tyto dva objekty.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.

Pokud objekt, který se používá jako klíč v zatřiďovací tabulce neposkytuje užitečné provádění GetHashCode, můžete určit zprostředkovatele kódu hash zadáním IEqualityComparer implementace do jednoho z přetížení Hashtable konstruktoru třídy.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.

Poznámky pro prostředí Windows RuntimeWindows RuntimeNotes for the prostředí Windows RuntimeWindows Runtime

Při volání GetHashCode metodu na třídu v prostředí Windows RuntimeWindows Runtime, poskytuje výchozí chování pro třídy, které nepřepíšete GetHashCode.When you call the GetHashCode method on a class in the prostředí Windows RuntimeWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Jedná se o součást podpory, kterou rozhraní .NET Framework poskytuje pro prostředí Windows RuntimeWindows Runtime (viz podporu pro Windows Store aplikací využívajících .NET Framework a prostředí Windows Runtime).This is part of the support that the .NET Framework provides for the prostředí Windows RuntimeWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). Třídy v prostředí Windows RuntimeWindows Runtime Nedědit Objecta nemusíte implementovat GetHashCode.Classes in the prostředí Windows RuntimeWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Zobrazí se však mít ToString, Equals(Object), a GetHashCode metody, když je použijete v kódu C# nebo Visual Basic a rozhraní .NET Framework poskytuje výchozí chování pro tyto metody.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.

Poznámka

prostředí Windows RuntimeWindows Runtime třídy, které jsou napsané v C# nebo Visual Basic můžete přepsat GetHashCode metody.classes that are written in C# or Visual Basic can override the GetHashCode method.

Poznámky pro dědice

Funkce hash umožňuje rychle generovat číslo (hodnota hash), která odpovídá hodnotě objektu.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Funkce hash jsou obvykle specifické pro každý typ a jedinečný, musí používat aspoň jedno z polí instance jako vstup.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Pomocí hodnoty statických polí by neměly vypočítat kódů hash.Hash codes should not be computed by using the values of static fields.

Pro třídy odvozené z Object, GetHashCode metoda může delegovat na základní třídu GetHashCode() implementace pouze v případě, že odvozené třídy definuje rovnosti bude referenční rovnost.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. Výchozí implementace GetHashCode() pro referenční typy vrátí hodnotu hash, který je ekvivalentní s histogramem vrácené 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. Můžete přepsat GetHashCode() nezměnitelný odkazový typů.You can override GetHashCode() for immutable reference types. Obecně platí, pro proměnlivé odkazové typy, by měly přepsat GetHashCode() pouze tehdy, pokud:In general, for mutable reference types, you should override GetHashCode() only if: -Může vypočítat hodnotu hash z polí, která nejsou proměnlivé; nebo- You can compute the hash code from fields that are not mutable; or -Můžete zajistit, že hodnota hash objektu proměnlivé nezmění při objektu je obsažen v kolekci, která závisí na jeho kód hash.- 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.

V opačném případě si možná myslíte, že dojde ke ztrátě měnitelný objekt v zatřiďovací tabulce.Otherwise, you might think that the mutable object is lost in the hash table. Pokud budete chtít přepsat GetHashCode() pro proměnlivý odkazový typ dokumentaci by mělo být jasné, že uživatelé vašeho typu neměli měnit hodnoty objektu, zatímco objekt se uloží v zatřiďovací tabulce.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.

U typů hodnot GetHashCode() poskytuje výchozí implementaci kódu hash, která používá reflexi.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Měli byste zvážit přepsání pro zajištění lepšího výkonu.You should consider overriding it for better performance.

Další informace a příklady, které počítají hodnoty hash kódy v mnoha různými způsoby najdete v části Příklady.For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Funkce hash, musíte mít následující vlastnosti:A hash function must have the following properties: -Li porovnat dva objekty rovnají, GetHashCode() metoda pro každý objekt musí vrátit stejnou hodnotu.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Nicméně, pokud dva objekty rovnají, neporovnávejte GetHashCode() metody pro tyto dva objekty nemusí vracet různé hodnoty.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values.

GetHashCode() Metodu pro objekt, musí vracet konzistentně, stejná hodnota hash, dokud není žádné úpravy stav objektu, který určuje návratovou hodnotu objektu 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. Všimněte si, že to platí pouze pro aktuální spuštění aplikace a různé hash kód může být vrácen, pokud je znovu spusťte aplikaci.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.

– Pro zajištění nejlepšího výkonu by měl generovat funkce hash rovnoměrná distribuce pro veškerý vstup, včetně vstup, který je silně v clusteru.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Důsledkem je, že malé změny stavu objektů by měl mít za následek velké změny výsledný kód hash pro zajištění nejlepšího výkonu tabulku hash.An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance.

– Funkce hodnoty hash by měla být cenově dostupné k výpočtu.- Hash functions should be inexpensive to compute.

GetHashCode() Metoda by neměla vyvolávat výjimky.- The GetHashCode() method should not throw exceptions.

Například provádění GetHashCode() metody poskytované String třída vrací stejné hash kódy pro identické řetězcové hodnoty.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Proto se dvěma String objekt vrací stejnou hodnotu hash, pokud představují stejnou hodnotu řetězce.Therefore, two String objects return the same hash code if they represent the same string value. Také, metoda používá všechny znaky v řetězci generovat rozumně náhodně distribuované výstup, i v případě, že vstup je clusterovaný. v některých oblastech (mnoho uživatelů může mít například řetězce, které obsahují pouze nižší 128 znaků ASCII, i když řetězec může obsahovat žádný z 65 535 znaků Unicode).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).

Poskytování dobré hashovací funkci na třídu může výrazně ovlivnit výkon přidání těchto objektů do tabulky hash.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. V zatřiďovací tabulku s klíči, které poskytují správná implementace funkce hash, hledání elementu konstantní nějakou dobu trvá (např. operace 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). V zatřiďovací tabulce s nekvalitní implementace funkce hash, výkon hledání závisí na počtu položek v zatřiďovací tabulce (například O (n) operace, kde n je počet položek v zatřiďovací tabulce).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). Uživatel se zlými úmysly může zadat data, která zvýší počet kolizí, což může výrazně snížit výkon aplikace, které závisí na tabulky hash za následujících podmínek: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: – Když funkce hash vytvořit časté kolizí.- When hash functions produce frequent collisions.

– Velká část z objektů v zatřiďovací tabulce když vytvoření kódů hash, které jsou si rovny, nebo přibližně stejná mezi sebou.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another.

– Když uživatelům vstupní data, ze které je vypočítán hodnota hash.- When users input the data from which the hash code is computed.

Odvozené třídy, které přepíší GetHashCode() musí také přepsat Equals(Object) zaručí, že dva objekty, které jsou považovány za shodné mají stejnou hodnotu hash; v opačném případě Hashtable typ nemusí fungovat správně.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.

Platí pro

Viz také