Die hashCode()
Methode der Klasse Boolean wird folgendermaßen implementiert:
public int hashCode() {
return value ? 1231 : 1237;
}
Warum werden 1231 und 1237 verwendet? Warum nicht noch etwas?
Die hashCode()
Methode der Klasse Boolean wird folgendermaßen implementiert:
public int hashCode() {
return value ? 1231 : 1237;
}
Warum werden 1231 und 1237 verwendet? Warum nicht noch etwas?
Antworten:
1231 und 1237 sind nur zwei (ausreichend große) beliebige Primzahlen . Alle anderen zwei großen Primzahlen würden gut tun.
Warum Primzahlen?
Angenommen, wir haben für eine Sekunde zusammengesetzte Zahlen (Nicht-Primzahlen) ausgewählt, z. B. 1000 und 2000. Wenn Boolesche Werte in eine Hash-Tabelle eingefügt werden, werden true und false in den Bucket 1000 % N
bzw. in den Bucket 2000 % N
(wo N
ist die Anzahl der Buckets) eingegeben .
Beachten Sie jetzt das
1000 % 8
gleicher Eimer wie 2000 % 8
1000 % 10
gleicher Eimer wie 2000 % 10
1000 % 20
gleicher Eimer wie 2000 % 20
Mit anderen Worten, es würde zu vielen Kollisionen führen .
Dies liegt daran, dass die Faktorisierung von 1000 (2 3 , 5 3 ) und die Faktorisierung von 2000 (2 4 , 5 3 ) so viele gemeinsame Faktoren haben. Daher werden Primzahlen gewählt, da es unwahrscheinlich ist, dass sie gemeinsame Faktoren mit der Schaufelgröße haben.
Warum große Primzahlen? Würden 2 und 3 nicht tun?
Bei der Berechnung von Hash-Codes für zusammengesetzte Objekte werden häufig die Hash-Codes für die Komponenten hinzugefügt. Wenn in einem Hash-Set mit einer großen Anzahl von Buckets zu kleine Werte verwendet werden, besteht die Gefahr, dass Objekte ungleichmäßig verteilt werden.
Sind Kollisionen wichtig? Boolesche Werte haben sowieso nur zwei verschiedene Werte?
Karten können zusammen mit anderen Objekten Boolesche Werte enthalten. Wie von Drunix hervorgehoben, besteht eine übliche Methode zum Erstellen von Hash-Funktionen von zusammengesetzten Objekten darin, die Hash-Code-Implementierungen der Unterkomponenten wiederzuverwenden. In diesem Fall ist es gut, große Primzahlen zurückzugeben.
Verwandte Fragen:
2*1231 = 2462
Eimer. Sind Kollisionen in einer solchen Situation ein Problem?