Mi chiedo se l'implementazione predefinita di Java Hashtable#hashCode()
sia interrotta quando lo Hashtable
contiene solo voci con chiavi e valori identici per coppia.Implementazione hashCode() di Java Hashtable # rotta?
Si veda ad esempio la seguente applicazione:
public class HashtableHash {
public static void main(final String[] args) {
final Hashtable<String, String> ht = new Hashtable<String, String>();
final int h1 = ht.hashCode();
System.out.println(h1); // output is 0
ht.put("Test", "Test");
final int h2 = ht.hashCode();
System.out.println(h2); // output is 0 ?!?
// Hashtable#hashCode() uses this algorithm to calculate hash code
// of every element:
//
// h += e.key.hashCode()^e.value.hashCode()
//
// The result of XOR on identical hash codes is always 0
// (because all bits are equal)
ht.put("Test2", "Hello world");
final int h3 = ht.hashCode();
System.out.println(h3); // output is some hash code
}
}
il codice hash per un Hashtable vuota è 0. Dopo una voce con la chiave e il valore "Test"
"Test"
è stato aggiunto al Hastable il codice hash ancora è 0.
il problema è che nel metodo di Hashtable hashCode()
il codice hash di ogni voce viene calcolato e aggiunto al codice hash come segue
Tuttavia XOR
su codici hash identici (come nel caso di stringhe identiche) è sempre 0. Pertanto, le voci con chiavi e valori identici non fanno parte del codice hash di Hashtable.
Questa implementazione è imho interrotta perché l'Hashtable è effettivamente cambiato. Non dovrebbe essere importante se la chiave e il valore sono identici.
Mi chiedo perché questo è stato downvoted perché è una domanda legittima e potrebbe salvare alcuni problemi. Ho cercato ore per trovare un bug causato da questo comportamento. –
* non è possibile * fare affidamento su un hashcode diverso solo perché l'oggetto è diverso. Diresti che l'hashCode è rotto anche se aggiungo due oggetti completamente diversi e anche l'hashCode rimane lo stesso? In tal caso, ogni possibile implementazione di hashcode viene interrotta se l'universo di possibili oggetti è maggiore di 2^32 .. – Voo
È più un'osservazione che una domanda. (Sebbene non sia il mio downvote.) –