Java: Eine "prime" - Reihe oder "power of two" als HashMap-Größe?
Viele Bücher und tutorials sagen, dass die Größe einer Hashtabelle muss eine Primzahl gleichmäßig zu verteilen und die Tasten in alle buckets. Aber Java ist HashMap
verwendet immer eine Größe, die eine Potenz von zwei. Sollte es nicht mit einem prime? Was ist besser, ein "prime" - oder "power of two", wie die hash-Tabelle der Größe?
- Ich bezweifle, dass Sie wirklich genau sagen, dass, und wenn Sie tun, Sie sind falsch. Das ist nur ein Weg, es zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einer Leistung von zwei effektiv-Masken aus oberen bits der hash-code. So eine schlechte hash-Funktion könnte besonders schlecht in diesem Szenario.
Java
HashMap
verringert diese durch misstrauten das ObjekthashCode()
Umsetzung und anwenden einer zweiten Stufe der Vermischung zu Ihrem Ergebnis:Wenn Sie eine gute hash-Funktion, oder etwas ähnliches tun, was
HashMap
hat, spielt es keine Rolle, ob Sie Primzahlen usw. als die Größe der Tabelle.Wenn auf der anderen Seite, die hash-Funktion ist von unbekannten oder von schlechter Qualität, dann mit einer Primzahl wäre eine sicherere Wette. Es wird jedoch dynamisch-große Tabellen tricker zu implementieren, da alle von einer plötzlichen Sie müssen in der Lage sein zu produzieren Primzahlen, anstatt nur die Multiplikation der Größe mit einem Konstanten Faktor.
Standard HashMap-Implementierung hat eine
hash
Methode, die aufwärmt Ihr Objekt die hashcode zu vermeiden, die Falle. Der Kommentar vor derhash()
Methode liest:Der einzige Weg zu wissen, was besser ist zwischen Haupt-und power-of-two ist es zum benchmark.
Vor vielen Jahren, beim schreiben eines assembler, deren Leistung hing stark auf symbol-talbe-lookup, getestet habe ich dies mit einem großen block generierten Bezeichner. Auch mit einer naiv-mapping, fand ich, dass die Kraft-der-zwei, wie erwartet, hatte weniger gleichmäßige Verteilung und längere Ketten als eine ähnlich große prime Anzahl der buckets. Es lief noch schneller, weil die Geschwindigkeit von Eimer-Auswahl durch bit-Maskierung.
Nehme ich stark an java.util-Entwickler würden nicht gegriffen haben, um die extra-hashing-und Kraft-der-zwei ohne benchmarking ist es, gegen eine prime Anzahl der buckets. Es ist eine sehr offensichtliche Sache zu tun ist, wenn das entwerfen einer Hash-Datenstruktur.
Deshalb, ich bin mir sicher, dass die Neuauflage und Kraft-der-zwei-Größe bietet eine bessere Leistung für typische Java-hash-maps als eine prime Anzahl der buckets.
Leistung/Berechnung Zeit Sicht-power-of-two Größen berechnet werden kann, mit nur bit-Maskierung, das geht schneller als integer-division, die sonst benötigt würden.
Sollten Sie wahrscheinlich verwenden prime Größe, hash-Tabellen, wenn Sie verwenden quadratische Sondieren für die kollisionsauflösung. Wenn Sie ein prime Größe Tisch, quadratische Sondieren wird, trifft die Hälfte der Einträge, weniger, wenn es ist nicht eine Primzahl. So könnten Sie nicht finden, einen geeigneten Ort zu speichern Sie den Eintrag, auch wenn Ihre hash-Tabelle ist weniger als halb voll. Seit Java hash-maps nicht verwenden quadratische Sondieren, gibt es keine Notwendigkeit zu verwenden Primzahlen als Größe.