Ho cercato dappertutto, ma non riesco a trovare nulla. Qualcuno può far luce su questo?Come viene implementato GetHashCode() per Int32?
risposta
Secondo Riflettore:
public override int GetHashCode()
{
return this;
}
Ha un senso, lo fa?
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.
Sì, ma questo non significa necessariamente che sia stato implementato in questo modo. :) –
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. –
@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
- 1. Come viene implementato set()?
- 2. Come viene implementato BigDecimal?
- 3. Come viene implementato "const"?
- 4. Come viene implementata GetHashCode() della stringa C#?
- 5. come viene implementato il sarcmark?
- 6. Come viene implementato maximal-munch?
- 7. come viene implementato il multi_index
- 8. Come viene implementato Google Calculator?
- 9. Come viene implementato l'I/O non bloccante?
- 10. Come viene implementato Atan2 in .NET?
- 11. Come viene implementato lo Scoping Lexical?
- 12. Come viene implementato l'idioma Spark select-explode?
- 13. Come viene effettivamente implementato Wami Recorder?
- 14. Come viene implementato setTimeout in node.js
- 15. Come viene implementato string.find in CPython?
- 16. Come viene implementato l'operatore sizeof in C++?
- 17. Arrays.sort (Object [] a) - come viene implementato?
- 18. Come viene implementato "letrec" senza usare "set!"?
- 19. Come viene implementato LLVM <>?
- 20. Uguaglianza GetHashCode
- 21. Implementazione GetHashCode
- 22. Perché Int32.MaxValue * Int32.MaxValue == 1?
- 23. GetHashCode() con^
- 24. Come viene implementato il timer Java dal computer?
- 25. Come viene implementato il doodle di buckyball di Google?
- 26. Esce il programma di blocco del sonno? Come viene implementato?
- 27. Come viene implementato "fornito" in un fatto a Midje?
- 28. Come viene implementato l'inserimento di std :: vector? C++
- 29. Come viene implementato il conto di mantenimento in NSObject?
- 30. Come viene implementato LongAccumulator, in modo che sia più efficiente?
Suppongo. Stavo pensando che tutti i tipi di valore avrebbero un'implementazione comune. –
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. –
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 è –