Condividi tramite


Object.GetHashCode Metodo

Definizione

Funge da funzione hash predefinita.

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.

Commenti

Per altre informazioni su questa API, vedere Note sulle API supplementari per Object.GetHashCode.

Note per gli eredi

Una funzione hash viene usata per generare rapidamente un numero (codice hash) che corrisponde al valore di un oggetto. Le funzioni hash sono in genere specifiche di ogni tipo e, per l'univocità, devono usare almeno uno dei campi dell'istanza come input. I codici hash non devono essere calcolati usando i valori dei campi statici.

Per le classi derivate da Object, il GetHashCode metodo può delegare all'implementazione della classe GetHashCode() di base solo se la classe derivata definisce l'uguaglianza di riferimento. L'implementazione predefinita di GetHashCode() per i tipi riferimento restituisce un codice hash equivalente a quello restituito dal GetHashCode(Object) metodo . È possibile eseguire l'override GetHashCode() per i tipi riferimento non modificabili. In generale, per i tipi riferimento modificabili, è consigliabile eseguire l'override GetHashCode() solo se:

  • È possibile calcolare il codice hash dai campi che non sono modificabili; O

  • È possibile assicurarsi che il codice hash di un oggetto modificabile non venga modificato mentre l'oggetto è contenuto in una raccolta che si basa sul codice hash.

In caso contrario, si potrebbe pensare che l'oggetto modificabile venga perso nella tabella hash. Se si sceglie di eseguire l'override per un tipo di riferimento modificabile, la documentazione GetHashCode() deve rendere chiaro che gli utenti del tipo non devono modificare i valori degli oggetti mentre l'oggetto è archiviato in una tabella hash.

Per i tipi valore, GetHashCode() fornisce un'implementazione predefinita del codice hash che usa la reflection. È consigliabile valutarne l'override per ottenere prestazioni migliori.

Per altre informazioni ed esempi che calcolano i codici hash in diversi modi, vedere la sezione Esempi.

Una funzione hash deve avere le proprietà seguenti:

  • Se due oggetti vengono confrontati come uguali, il GetHashCode() metodo per ogni oggetto deve restituire lo stesso valore. Tuttavia, se due oggetti non vengono confrontati come uguali, i GetHashCode() metodi per i due oggetti non devono restituire valori diversi.

  • Il GetHashCode() metodo per un oggetto deve restituire in modo coerente lo stesso codice hash, purché non siano state apportate modifiche allo stato dell'oggetto che determina il valore restituito del metodo System.Object.Equals dell'oggetto. Si noti che questo vale solo per l'esecuzione corrente di un'applicazione e che è possibile restituire un codice hash diverso se l'applicazione viene eseguita di nuovo.

  • Per ottenere prestazioni ottimali, una funzione hash deve generare una distribuzione uniforme per tutti gli input, incluso l'input fortemente raggruppato. Un'implicazione è che piccole modifiche allo stato dell'oggetto dovrebbero comportare modifiche di grandi dimensioni al codice hash risultante per ottenere prestazioni ottimali della tabella hash.

  • Le funzioni hash devono essere poco costose da calcolare.

  • Il GetHashCode() metodo non deve generare eccezioni.

Ad esempio, l'implementazione del GetHashCode() metodo fornito dalla String classe restituisce codici hash identici per valori stringa identici. Pertanto, due String oggetti restituiscono lo stesso codice hash se rappresentano lo stesso valore stringa. Inoltre, il metodo usa tutti i caratteri nella stringa per generare un output distribuito ragionevolmente casuale, anche quando l'input è raggruppato in determinati intervalli (ad esempio, molti utenti potrebbero avere stringhe che contengono solo i caratteri ASCII inferiori di 128, anche se una stringa può contenere uno dei 65.535 caratteri Unicode).

La fornitura di una funzione hash valida in una classe può influire in modo significativo sulle prestazioni dell'aggiunta di tali oggetti a una tabella hash. In una tabella hash con chiavi che forniscono un'implementazione valida di una funzione hash, la ricerca di un elemento richiede tempo costante (ad esempio, un'operazione O(1). In una tabella hash con un'implementazione scarsa 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. Un utente malintenzionato può immettere dati che aumentano il numero di conflitti, che possono ridurre significativamente le prestazioni delle applicazioni che dipendono dalle tabelle hash, in base alle condizioni seguenti:

  • Quando le funzioni hash producono conflitti frequenti.

  • Quando una percentuale elevata di oggetti in una tabella hash produce codici hash uguali o approssimativamente uguali l'uno all'altro.

  • Quando gli utenti inseriscono i dati da cui viene calcolato il codice hash.

Le classi derivate che eseguono l'override devono anche eseguire l'override GetHashCode()Equals(Object) per garantire che due oggetti considerati uguali abbiano lo stesso codice hash. In caso contrario, il Hashtable tipo potrebbe non funzionare correttamente.

Si applica a

Vedi anche