Sto cercando di capire l'implementazione nativa del metodo hashCode()
. Cosa restituisce esattamente questo metodo? È un indirizzo di memoria o è un valore casuale?Java Object.hashCode() - address o random()?
risposta
.hashCode()
implementazione nativa dipende JVM.
E.g. HotSpot ha 6 implementazioni Object.hashCode()
. È possibile scegliere utilizzando -XX:hashCode=n
bandiera esecuzione JVM tramite linea di comando, dove n:
0 - Park-Miller RNG (default)
1 - f (indirizzo, global_statement)
2 - costante 1
3 - contatore seriale
4 - oggetto indirizzo
5 - Xorshift thread-local
È anche interessante notare che poiché lo spazio per archiviare le cose nell'intestazione dell'oggetto è limitato, l'hashcode predefinito è solo [25 bit di larghezza] (https://stackoverflow.com/questions/26357186/what-is-in-java -object-header), non i 32 bit completi di un int. – Boann
Per quanto ragionevolmente possibile, il metodo hashCode definito dalla classe Object non ritorno interi distinti per oggetti distinti. (Questo è tipicamente implementato convertendo l'indirizzo interno dell'oggetto in numero intero, ma questa tecnica attuazione non è richiesta dal linguaggio programmazione Java TM.)
Così può essere correlato ad una memoria indirizzo, ma non deve essere - e sicuramente non dovresti dare per scontato che sia collegato alla memoria.
Nulla di ciò che si fa con un codice hash dovrebbe preoccuparsene affatto. I uniche cose che si dovrebbe dedurre da codici hash sono:
- Se i codici hash di due oggetti sono gli stessi, hanno possono essere oggetti uguali
- Se i codici hash di due oggetti sono diversi, essi non sono oggetti uguali (assumendo una corretta attuazione, sia sostituito o meno)
Considerando GC, può l'hash codice è anche l'indirizzo di memoria, in primo luogo? Per l'uso nelle tabelle hash, non dovrebbe davvero cambiare in modo imprevedibile durante l'esecuzione. – millimoose
@millimoose: Sicuramente non può essere l'indirizzo di memoria * corrente * di fronte a un GC di compattazione. Ma potrebbe essere "l'indirizzo al momento della prima chiamata, che viene poi ricordato per dopo" forse. Cerco di non preoccuparmi troppo :) –
Passando al [vecchio estratto di codice che ho trovato] (http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx), sicuramente * sembra * (nella misura in cui riesco a leggere la C piuttosto pelosa) come "un numero determinato una volta poi salvato". Con sei implementazioni disponibili, incluso l'indirizzo di memoria iniziale e un RNG. – millimoose
tua risposta sta here. Come menzionato nella documentazione:
Per quanto ragionevolmente pratico, il metodo hashCode definito dalla classe Object restituisce interi distinti per oggetti distinti. (Questo è tipicamente implementato convertendo l'indirizzo interno dell'oggetto in numero intero, ma questa tecnica attuazione non è richiesta dal linguaggio di programmazione JavaTM.)
- 1. Algoritmo Object.hashCode()
- 2. Costante di risultato Java, Object.hashCode() su tutte le JVM/sistemi?
- 3. Random int senza importare 'random'
- 4. java random string generation and birthday paradox
- 5. Funzione inversa della funzione Random di Java
- 6. Fuzzy Street Address Ricerche che utilizzano MySQL Fulltext (o sphinx?)
- 7. Get MAC address in Java utilizzando getHardwareAddress non deterministico
- 8. get return address GDB
- 9. Pointer/Address difference
- 10. kernel virtual address translation
- 11. Struttura dati Java con aggiunta, eliminazione e random efficienti
- 12. come random è Math.random() in java su diversi jvms o macchine diverse
- 13. PHP mail function 'from' address
- 14. JQuery/JavaScript MAC Address Validation
- 15. Crappy Random Number Generator
- 16. Fast Random Generator
- 17. Random Session Invalidation
- 18. Come codificare base64/dev/random o/dev/urandom?
- 19. RSA_generate_key() utilizzando prngd invece di/dev/random o/dev/urandom
- 20. Java random restituisce sempre una tendenza negativa a lungo termine?
- 21. Java: Random valore a lungo in un intervallo
- 22. Simple 2D Random walk
- 23. Esistono sementi per Matlab Random e C++ Random?
- 24. Come generare random a 64 bit con boost random
- 25. C'è una ragione per cui Object.hashCode() è a 31 bit?
- 26. AVAudioPlayer e Random lentezza
- 27. Random Forest sta sovralimentando
- 28. random.choice non random
- 29. Will random() cambierà mai?
- 30. Porte tcp Nodejs random free
Le fonti OpenJDK dovrebbero dire. Dubito che sia un indirizzo di memoria dato che il GC può spostare oggetti in memoria, probabilmente è una sorta di handle di oggetti interni. – millimoose
Questo è un estratto di detto codice del 2008: http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx – millimoose
E direttamente dalla bocca del cavallo: http: // hg .openjdk.java.net/jdk7/hotspot/hotspot/file/9b0ca45cd756/src/share/vm/runtime/synchronizer.cpp Il codice ha lo stesso aspetto del post del blog. – millimoose