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

Definizione

Funge da funzione hash predefinita.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

Restituisce

Codice hash per l'oggetto corrente.A hash code for the current object.

Esempi

Uno dei modi più semplici per calcolare un codice hash per un valore numerico con lo stesso o un intervallo inferiore rispetto al Int32 tipo è semplicemente restituire tale valore.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. Nell'esempio seguente viene illustrata un'implementazione di Number questo tipo per una struttura.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

Spesso un tipo ha più campi dati che possono partecipare alla generazione del codice hash.Frequently, a type has multiple data fields that can participate in generating the hash code. Un modo per generare un codice hash consiste nel combinare questi campi usando un' XOR (eXclusive OR) operazione, come illustrato nell'esempio seguente.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   

Nell'esempio precedente viene restituito lo stesso codice hash per (N1, N2) e (N2, N1), quindi è possibile che vengano generati più collisioni di quelli desiderati.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Sono disponibili numerose soluzioni in modo che i codici hash in questi casi non siano identici.A number of solutions are available so that hash codes in these cases are not identical. Uno consiste nel restituire il codice hash di un Tuple oggetto che riflette l'ordine di ogni campo.One is to return the hash code of a Tuple object that reflects the order of each field. Nell'esempio seguente viene illustrata un'implementazione possibile che Tuple<T1,T2> utilizza la classe.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Si noti, tuttavia, che il sovraccarico delle prestazioni della creazione Tuple di un'istanza di un oggetto può influire in modo significativo sulle prestazioni complessive di un'applicazione che archivia un numero elevato di oggetti nelle tabelle hash.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

Una seconda soluzione alternativa consiste nel ponderare i singoli codici hash spostando a sinistra i codici hash dei campi successivi di due o più bit.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. In modo ottimale, anziché essere scartati, i bit spostati oltre il bit 31 dovrebbero essere rivolti anziché essere rimossi.Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. Poiché i bit vengono rimossi dagli operatori di spostamento a sinistra sia C# in che in Visual Basic, è necessario creare un metodo di spostamento a capo a sinistra come il seguente: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

Nell'esempio seguente viene quindi utilizzato questo metodo shift-and-wrap per calcolare il codice hash della Point struttura utilizzata negli esempi precedenti.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

Commenti

Un codice hash è un valore numerico utilizzato per inserire e identificare un oggetto in una raccolta basata su hash, ad esempio la Dictionary<TKey,TValue> classe, la Hashtable classe o DictionaryBase un tipo derivato dalla classe.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. Il GetHashCode metodo fornisce questo codice hash per gli algoritmi che richiedono controlli rapidi di uguaglianza degli oggetti.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Nota

Per informazioni sul modo in cui vengono usati i codici hash nelle tabelle hash e per alcuni algoritmi di codice hash aggiuntivi, vedere la voce della funzione hash 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.

Due oggetti che corrispondono a codici hash restituiti uguali.Two objects that are equal return hash codes that are equal. Tuttavia, il contrario non è vero: i codici hash uguali non implicano l'uguaglianza dell'oggetto, perché gli oggetti diversi (diversi) possono avere codici hash identici.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. .NET non garantisce inoltre l'implementazione predefinita del GetHashCode metodo e il valore restituito da questo metodo può essere diverso tra le implementazioni di .NET, ad esempio versioni diverse di .NET Framework e .NET Core e piattaforme, ad esempio 32 bit e piattaforme a 64 bit.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. Per questi motivi, non usare l'implementazione predefinita di questo metodo come un identificatore di oggetto univoco per scopi di hashing.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. Di seguito sono ririvate due conseguenze:Two consequences follow from this:

  • Non si deve presupporre che i codici hash uguali implichino l'uguaglianza degli oggetti.You should not assume that equal hash codes imply object equality.

  • Non è mai possibile salvare in modo permanente o usare un codice hash all'esterno del dominio dell'applicazione in cui è stato creato, perché lo stesso oggetto può eseguire l'hashing tra domini applicazione, processi e piattaforme.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.

Avviso

Un codice hash è progettato per l'inserimento e la ricerca efficienti in raccolte basate su una tabella hash.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Un codice hash non è un valore permanente.A hash code is not a permanent value. Per questo motivo:For this reason:

  • Non serializzare i valori di codice hash né archiviarli nei database.Do not serialize hash code values or store them in databases.
  • Non usare il codice hash come chiave per recuperare un oggetto da una raccolta con chiave.Do not use the hash code as the key to retrieve an object from a keyed collection.
  • Non inviare codici hash tra domini applicazione o processi.Do not send hash codes across application domains or processes. In alcuni casi, i codici hash possono essere calcolati in base al dominio per processo o per applicazione.In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • Non usare il codice hash invece di un valore restituito da una funzione di hashing crittografico se è necessario un hash crittograficamente sicuro.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. Per gli System.Security.Cryptography.HashAlgorithm hash crittografici, usare una classe derivata dalla classe o System.Security.Cryptography.KeyedHashAlgorithm .For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • Non verificare l'uguaglianza dei codici hash per determinare se due oggetti sono uguali.Do not test for equality of hash codes to determine whether two objects are equal. Gli oggetti diversi possono avere codici hash identici. Per verificare l'uguaglianza, chiamare il ReferenceEquals metodo Equals o.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

Il GetHashCode metodo può essere sottoposto a override da un tipo derivato.The GetHashCode method can be overridden by a derived type. Se GetHashCode non viene sottoposto a override, i codici hash per i tipi di riferimento vengono Object.GetHashCode calcolati chiamando il metodo della classe di base, che calcola un codice hash basato sul riferimento di un oggetto. per ulteriori RuntimeHelpers.GetHashCodeinformazioni, vedere.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. In altre parole, due oggetti per i quali ReferenceEquals il metodo true restituisce codici hash identici.In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. Se i tipi di valore non GetHashCodeeseguono l' ValueType.GetHashCode override, il metodo della classe base usa la reflection per calcolare il codice hash in base ai valori dei campi del tipo.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. In altre parole, i tipi di valore i cui campi hanno valori uguali hanno codici hash uguali.In other words, value types whose fields have equal values have equal hash codes. Per ulteriori informazioni sull'override GetHashCodedi, vedere la sezione "note per gli eredi".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Avviso

Se si esegue l' GetHashCode override del metodo, è necessario Equalsanche eseguire l'override di e viceversa.If you override the GetHashCode method, you should also override Equals, and vice versa. Se il metodo sottoposto a true override Equals viene restituito quando si verifica l'uguaglianza di due oggetti GetHashCode , il metodo sottoposto a override deve restituire lo stesso valore per i due oggetti.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.

Se un oggetto usato come chiave in una tabella hash non fornisce un'implementazione utile di GetHashCode, è possibile specificare un provider di codice hash fornendo un' IEqualityComparer implementazione a uno degli overload del costruttore della Hashtable classe.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.

Note per ilWindows RuntimeWindows RuntimeNotes for the Windows RuntimeWindows Runtime

Quando si chiama il GetHashCode metodo su una classe Windows RuntimeWindows Runtimein, fornisce il comportamento predefinito per le classi che non eseguono l' GetHashCodeoverride di.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. Questo è parte del supporto fornito dal .NET Framework per (vedere Windows RuntimeWindows Runtime .NET Framework supporto per le app di Windows Store e 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). Le classi in Windows RuntimeWindows Runtime non ereditano Object GetHashCodee attualmente non implementano.Classes in the Windows RuntimeWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Tuttavia ToString, sembrano avere metodi, Equals(Object)e GetHashCode quando vengono usati nel codice C# o Visual Basic e il .NET Framework fornisce il comportamento predefinito per questi metodi.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.

Nota

Windows RuntimeWindows Runtimele classi scritte in C# o Visual Basic possono eseguire l'override GetHashCode del metodo.classes that are written in C# or Visual Basic can override the GetHashCode method.

Note per gli eredi

Una funzione hash viene utilizzata per generare rapidamente un numero (codice hash) che corrisponde al valore di un oggetto.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Le funzioni hash sono in genere specifiche per ogni tipo e, per l'univocità, devono utilizzare almeno uno dei campi di istanza come input.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. I codici hash non devono essere calcolati con i valori dei campi statici.Hash codes should not be computed by using the values of static fields.

Per le classi derivate GetHashCode da Object, il metodo può delegare all'implementazione della classe GetHashCode() di base solo se la classe derivata definisce l'uguaglianza come uguaglianza dei riferimenti.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. L'implementazione predefinita di GetHashCode() per i tipi di riferimento restituisce un codice hash equivalente a quello restituito GetHashCode(Object) dal metodo.The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. È possibile eseguire GetHashCode() l'override di per i tipi di riferimento non modificabili.You can override GetHashCode() for immutable reference types. In generale, per i tipi di riferimento modificabili, GetHashCode() è consigliabile eseguire l'override solo se:In general, for mutable reference types, you should override GetHashCode() only if: -È possibile calcolare il codice hash da campi che non sono modificabili; o- You can compute the hash code from fields that are not mutable; or -È possibile verificare che il codice hash di un oggetto modificabile non cambi mentre l'oggetto è contenuto in una raccolta che si basa sul relativo codice 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.

In caso contrario, si potrebbe pensare che l'oggetto modificabile venga perso nella tabella hash.Otherwise, you might think that the mutable object is lost in the hash table. Se si sceglie di eseguire l' GetHashCode() override per un tipo di riferimento modificabile, la documentazione dovrebbe chiarire che gli utenti del tipo non devono modificare i valori degli oggetti mentre l'oggetto è archiviato in una tabella hash.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.

Per i tipi di GetHashCode() valore, fornisce un'implementazione del codice hash predefinita che usa la reflection.For value types, GetHashCode() provides a default hash code implementation that uses reflection. È consigliabile eseguire l'override per ottenere prestazioni migliori.You should consider overriding it for better performance.


Per ulteriori informazioni ed esempi per il calcolo dei codici hash in diversi modi, vedere la sezione esempi.For more information and examples that compute hash codes in a variety of ways, see the Examples section.

Una funzione hash deve avere le proprietà seguenti:A hash function must have the following properties: -Se due oggetti vengono considerati uguali, il GetHashCode() metodo per ogni oggetto deve restituire lo stesso valore.- If two objects compare as equal, the GetHashCode() method for each object must return the same value. Tuttavia, se due oggetti non vengono considerati uguali, non è GetHashCode() necessario che i metodi per i due oggetti restituiscano valori diversi.However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values. -Il GetHashCode() metodo per un oggetto deve restituire costantemente lo stesso codice hash purché non vi siano modifiche allo stato dell'oggetto che determina il valore restituito del metodo [System. Object. Equals](xref:System.Object.Equals*) dell'oggetto.- 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. Si noti che questo vale solo per l'esecuzione corrente di un'applicazione e che può essere restituito un codice hash diverso se l'applicazione viene eseguita nuovamente.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. -Per ottenere prestazioni ottimali, una funzione hash deve generare una distribuzione uniforme per tutti i dati di input, incluso l'input fortemente inserito in un cluster.- For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. Un'implicazione è che le piccole modifiche allo stato dell'oggetto possono comportare modifiche di grandi dimensioni al codice hash risultante per ottimizzare le prestazioni delle tabelle 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. -Le funzioni hash dovrebbero essere convenienti da calcolare.- Hash functions should be inexpensive to compute. -Il GetHashCode() metodo non deve generare eccezioni.- The GetHashCode() method should not throw exceptions. Ad esempio, l'implementazione del GetHashCode() metodo fornito String dalla classe restituisce codici hash identici per i valori stringa identici.For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. Pertanto, due String oggetti restituiscono lo stesso codice hash se rappresentano lo stesso valore stringa.Therefore, two String objects return the same hash code if they represent the same string value. Inoltre, il metodo utilizza tutti i caratteri della stringa per generare un output distribuito ragionevolmente in modo casuale, anche quando l'input viene inserito in un cluster in determinati intervalli. ad esempio, molti utenti potrebbero avere stringhe che contengono solo i caratteri ASCII 128 inferiori, anche se la stringa può contenere uno dei caratteri 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). Fornire una funzione hash efficace su una classe può influire in modo significativo sulle prestazioni dell'aggiunta di tali oggetti a una tabella hash.Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. In una tabella hash con chiavi che forniscono una corretta implementazione di una funzione hash, la ricerca di un elemento richiede un tempo costante, ad esempio un'operazione 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). In una tabella hash con una scarsa implementazione di una funzione hash, le prestazioni di una ricerca dipendono dal numero di elementi nella tabella hash (ad esempio, un'operazione O (`n`), dove `n` è il numero di elementi nella tabella hash).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). Un utente malintenzionato può inserire dati che aumentano il numero di collisioni, che possono compromettere significativamente le prestazioni delle applicazioni che dipendono da tabelle hash, nelle condizioni seguenti: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: -Quando le funzioni hash producono collisioni frequenti.- When hash functions produce frequent collisions. -Quando una grande proporzione di oggetti in una tabella hash produce codici hash uguali o approssimativamente uguali tra loro.- When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another. -Quando gli utenti impostano i dati da cui viene calcolato il codice hash.- When users input the data from which the hash code is computed. Anche le classi derivate che Equals(Object) eseguono l'override GetHashCode() di devono eseguire l'override di per garantire che due oggetti considerati uguali Hashtable abbiano lo stesso codice hash. in caso contrario, il tipo potrebbe non funzionare correttamente.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.

Si applica a

Vedi anche