2010-10-08 17 views

risposta

42

Secondo Riflettore:

public override int GetHashCode() 
{ 
    return this; 
} 

Ha un senso, lo fa?

+0

Suppongo. Stavo pensando che tutti i tipi di valore avrebbero un'implementazione comune. –

+0

No, ogni tipo di Valore ha il suo. UInt32 si converte in Int32, questo si trasforma semplicemente in un Int firmato. Int16 e Int64 fanno un po 'di funky shifting per generare un valore a 32 bit. System.Boolean restituisce 0 o 1 a seconda del suo stato. –

+3

Interesing, perché quindi 'int a = 10;' e 'int b = 10.GetHashCode();' fornisce istruzioni x86 diverse. Vediamo che questo metodo a riga unica sarà in linea, quindi dovrebbe essere lo stesso, ma non è –

-2

Il modo migliore per eseguire l'hash a 32 bit su 32 bit non è inventare la ruota, utilizzare il valore stesso. Molto veloce, nessuna collisione, anzi un modo perfetto.

+3

Sì, ma questo non significa necessariamente che sia stato implementato in questo modo. :) –

+9

In realtà è un modo VIVACE di implementarlo. Per MS "Per ottenere prestazioni ottimali, una funzione di hash dovrebbe generare una distribuzione uniforme per tutti gli input, incluso l'input pesantemente in cluster. Un'implicazione è che piccole modifiche allo stato dell'oggetto dovrebbero comportare grandi modifiche al codice hash risultante per la migliore tabella hash prestazione." (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) Questa implementazione, sebbene semplice, causa un clustering errato e può portare a prestazioni orribili quando gli interi vengono utilizzati come chiavi hashtable. –

+10

@JeffWalkerCodeRanger Questo è generalmente vero. Ma la maggior parte delle tabelle hash sono implementate facendo 'hashCode% bucketLength'. Quindi la sequenza comune di '0, 1, 2, 3, ...' avrà codici hash perfetti. Tuttavia, se l'input è '0, 32, 64, 96, 128, ...' qualsiasi array di dimensioni bucket di potenza di due <= 32 avrà collisioni hash al 100%. Se MS lo modificasse per fare un po 'di shuffling, ci sarà un'altra sequenza che darà il 100% di collisioni hash. Il mio punto è che non esiste un contesto per Int32 e, senza contesto, non è possibile eseguire una buona funzione di hash. Se hai bisogno di dati hash, scrivi il tuo hasher. – Aidiakapi

Problemi correlati