Ein Hash-Code ist ein Index, und eine Hash-Tabelle, auf der untersten Ebene, ist ein Array. Aber für einen gegebenen Schlüsselwert bestimmen wir den Index in einer Hash-Tabelle anders, um einen viel schnelleren Datenabruf zu ermöglichen.
Beispiel: Sie haben 1.000 Wörter und ihre Definitionen. Sie möchten sie speichern, so dass Sie die Definition für ein Wort sehr, sehr schnell abrufen können - schneller als eine binäre Suche, was Sie mit einem Array tun müssten.
Sie erstellen also eine Hash-Tabelle. Sie beginnen mit einem Array, das wesentlich größer als 1.000 Einträge ist - sagen wir 5.000 (je größer, desto zeiteffizienter).
Die Art, wie Sie Ihre Tabelle verwenden, ist, nehmen Sie das Wort nachschlagen, und konvertieren Sie es in eine Zahl zwischen 0 und 4.999. Sie wählen den Algorithmus dafür; das ist der Hashalgorithmus.Aber Sie könnten zweifellos etwas schreiben, das sehr schnell wäre.
Dann verwenden Sie die konvertierte Zahl als Index in Ihr Array mit 5.000 Elementen und fügen Ihre Definition in diesen Index ein. Es gibt überhaupt keine Suche: Sie haben erstellt den Index direkt aus dem Suchwort.
Alle Operationen, die ich beschrieben habe, sind konstante Zeit; keiner von ihnen dauert länger, wenn wir die Anzahl der Einträge erhöhen. Wir müssen nur sicherstellen, dass genügend Platz im Hash vorhanden ist, um die Wahrscheinlichkeit von "Kollisionen" zu minimieren, dh die Wahrscheinlichkeit, dass zwei verschiedene Wörter in denselben Integer-Index konvertiert werden. Da dies bei jedem Hash-Algorithmus passieren kann, müssen wir Prüfungen hinzufügen, um zu sehen, ob es eine Kollision gibt, und etwas Spezielles tun (wenn "Hallo" und "Welt" beide auf 1.234 hashen und "Hallo" bereits in der Tabelle ist) werden wir mit "Welt" tun? Am Einfachsten ist es, es in 1,235 zu setzen, und passen Sie unsere Lookup-Logik, um diese Möglichkeit zu ermöglichen.)
Edit: Nach dem Lesen Ihres Beitrags: ein Hash-Algorithmus ist definitiv nicht zufällig, es muss deterministisch sein. Der Index, der in meinem Beispiel für "Hallo" generiert wird, muss jedes Mal 1.234 sein; Nur so kann die Suche funktionieren.
Der Hash ist nicht "mehr oder weniger zufällig"; es ist nur weniger. Also weniger zufällig als überhaupt nicht zufällig. Ein besseres Wort wäre "willkürlich". Und indem Sie sagen, der Hash ist "einzigartig für diese Daten", garantieren Sie, dass verschiedene Daten nicht denselben Hashwert ergeben. Und da das offensichtlich falsch ist, ist "einzigartig" nicht das richtige Wort. –
Ich meine zufällig, da es keine vorhersagbare Reihenfolge der Schlüssel von einem Hashcode im Vergleich zu Indizes in einer Liste gibt, die in der Reihenfolge zugewiesen werden. Ich werde versuchen, meine Punkte zu verdeutlichen, indem ich das umformuliere. – BobMcGee