Qual è l'algoritmo utilizzato nella JVM
per implementare java.lang.Object
s' implicita metodo hashCode()
?Qual è esattamente l'algoritmo utilizzato da hashCode di java.lang.Object
[OpenJDK
o Oracle JDK
sono preferiti nelle risposte].
Qual è l'algoritmo utilizzato nella JVM
per implementare java.lang.Object
s' implicita metodo hashCode()
?Qual è esattamente l'algoritmo utilizzato da hashCode di java.lang.Object
[OpenJDK
o Oracle JDK
sono preferiti nelle risposte].
E 'dipende dall'implementazione (e pesantemente così, l'algoritmo è interamente fino alla realizzazione, a patto che sia coerente.) Tuttavia, come per la risposta here, si può vedere la native source file dove l'hash è generato in OpenJDK 7 (guarda il funzione get_next_hash()
), che in realtà specifica un numero di possibili algoritmi in questa particolare versione:
// Possibilities:
// * MD5Digest of {obj,stwRandom}
// * CRC32 of {obj,stwRandom} or any linear-feedback shift register function.
// * A DES- or AES-style SBox[] mechanism
// * One of the Phi-based schemes, such as:
// 2654435761 = 2^32 * Phi (golden ratio)
// HashCodeValue = ((uintptr_t(obj) >> 3) * 2654435761)^GVars.stwRandom ;
// * A variation of Marsaglia's shift-xor RNG scheme.
// * (obj^stwRandom) is appealing, but can result
// in undesirable regularity in the hashCode values of adjacent objects
// (objects allocated back-to-back, in particular). This could potentially
// result in hashtable collisions and reduced hashtable efficiency.
// There are simple ways to "diffuse" the middle address bits over the
// generated hashCode values
//
Come già detto, l'algoritmo predefinito è di andare semplicemente con un numero casuale, tuttavia un interessante commento ulteriore down states:
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
// likely make this the default in future releases.
Questo è simile all'approccio (obj^stwRandom)
menzionato nella suddetta lista di possibilità, ma aggira le regolarità indesiderati associati con oggetti allocati in rapida successione legando "stato specifico-filo" informazioni nel hash anche - quindi se due oggetti sono stati allocati in un momento molto simile a causa della loro allocazione su due thread separati in esecuzione simultaneamente, le informazioni di threading discrete alimentate nell'hash dovrebbero comunque garantire che vengano generati discreti abbastanza hash.
Solo curioso ... Dato che Java è un open-source, cosa ti ha impedito di guardare te stesso? –
@ PM77-1 probabilmente questo è un metodo 'nativo' e non molte persone sanno dove cercare la sua implementazione. – Pshemo
Vedere http://stackoverflow.com/questions/17977495/java-object-hashcode-algorithm - che contiene collegamenti alla sorgente nativa. Tuttavia, dopo aver letto la fonte, sono ancora più confuso. – user2864740