2014-07-23 6 views
5

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].

+2

Solo curioso ... Dato che Java è un open-source, cosa ti ha impedito di guardare te stesso? –

+5

@ PM77-1 probabilmente questo è un metodo 'nativo' e non molte persone sanno dove cercare la sua implementazione. – Pshemo

+2

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

risposta

5

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.