Non è una risposta diretta alla sua domanda, che Jonas ha risposto bene, tuttavia questo può essere di aiuto, se siete preoccupati per test di uguaglianza in hash
Dai nostri test, a seconda di ciò che si sta richiedendo con codici hash, in C#, gli hashcode non devono essere univoci per le operazioni di uguaglianza. Ad esempio, considerare quanto segue:
Avevamo il requisito di sovraccaricare l'operatore di uguale, e quindi la funzione GetHashCode dei nostri oggetti non appena erano diventati volatili e senza stato, e di procurarsi direttamente dai dati, quindi in un unico punto di l'applicazione abbiamo bisogno di garantire che un oggetto potrebbe essere visto come uguale a un altro oggetto se è stato provenienti dagli stessi dati, non solo se era lo stesso riferimento. I nostri identificatori di dati univoci sono Guids.
L'operatore è uguale è stato facile per soddisfare come abbiamo appena controllato sul Guid del record (dopo aver controllato per nulla).
Sfortunatamente la dimensione dei dati HashCode (essendo un int) dipende dal sistema operativo, e sul nostro sistema a 32 bit, l'hashcode sarebbe 32 bit. Matematicamente, quando si sostituisce la funzione GetHashCode, è impossibile generare un codice hash univoco da un guid che è maggiore di 32 bit (osservarlo dal contrario, come si tradurrebbe un intero a 32 bit in un guid?).
Abbiamo quindi effettuato alcuni test in cui abbiamo preso il Guid come stringa e restituito il codice hash del Guid, che restituisce quasi sempre un identificativo univoco nei nostri test, ma non sempre.
Ciò che abbiamo notato, tuttavia, quando un oggetto si trova in un oggetto di raccolta hash (un hashtable, un dizionario, ecc.), Quando 2 oggetti non sono univoci ma i loro hashcode sono, l'hashcode viene utilizzato solo come prima opzione di ricerca, se sono utilizzati codici hash non univoci, l'operatore di uguaglianza viene sempre utilizzato come ripiego per determinare l'uguaglianza.
Come ho detto, questo può o non può essere rilevante per la tua situazione, ma se è un suggerimento utile.
UPDATE
Per dimostrare, abbiamo un Hashtable:
chiave: Object Un (HashCode 1), Valore oggetto A1
chiave: oggetto B (HashCode 1), Valore oggetto B1
chiave: Object C (hashCode 1), valore oggetto C1
chiave: oggetto D (hashCode 2), il valore Ob Ject D1
chiave: Object E (HashCode 3), oggetto valore E1
Quando io chiamo la tabella hash per l'oggetto con la chiave dell'oggetto A, verrà restituito l'oggetto A1 dopo 2 passaggi, un invito a hashcode 1, quindi un controllo di uguaglianza sull'oggetto chiave poiché non esiste una chiave univoca con l'hashcode 1
Quando chiamo l'hashtable per l'oggetto con la chiave dell'oggetto D, l'oggetto D1 verrà restituito dopo 1 passo , una ricerca hash
Conclusione: non persistere o trasmettere il risultato di 'GetHashCode()'. Usalo solo per lo scopo previsto: facilitare l'uso delle tabelle hash. –