Hash-tabelle
Höhepunkte dieser Übung:
Lab Übung:
Klicken Sie auf den kleinen Computer oben für eine detaillierte Beschreibung.
Für diese Übung werden Sie gebeten, ein Passwort Kontrollsystem zu implementieren, ein Benutzer-Passwort zu authentifizieren.
1. Definition eines Hash Table
Bevor wir in die Definition von Hash Tables bekommen, ist es gut vorstellen WARUM Hash-Tabellen zu verwenden.
Hash-Tabellen sind gut für eine schnelle Suche auf Dinge zu tun.
Zum Beispiel, wenn wir ein Array mit Daten gefüllt haben (sagen wir 100 Artikel). Wenn wir die Position, dass ein bestimmtes Element wussten in einem Array gespeichert ist, dann könnten wir es schnell zugreifen. So passieren wir nur zu wissen, dass das Element wir wollen an Position 3; Ich kann gelten:
MyItem = myarray [3];
Damit wir müssen nicht in der Anordnung durch jedes Element suchen, greifen wir nur Position 3.
Die Frage ist, wie können wir wissen, dass Position 3 speichert die Daten, die wir interessiert?
Dies ist, wo Hashing in praktisch. Gegeben einige Schlüssel, können wir eine Hash-Funktion, um es anzuwenden, einen Index oder die Position zu finden, die wir zugreifen wollen.
1.1 Was ist die Hash-Funktion?
Es gibt viele verschiedene Hash-Funktionen. Einige Hash-Funktionen werden einen Integer-Schlüssel nehmen und es in einen Index drehen. Ein allgemeines Verfahren ist die Teilung.
Lassen Sie uns ein Beispiel lernen:
1.2 Teilungsverfahren (ein Hash-Verfahren für ganze Zahlen)
Angenommen, Sie haben die folgenden Nummern oder Schlüssel hatte, die Sie in einer Reihe von 10 Elementen abbilden wollte:
123456
123467
123450
Um die Teilungsverfahren anzuwenden, könnte man die Anzahl von 10 (oder die maximale Anzahl der Elemente in dem Array) unterteilen und verwenden, den Rest (Modulo) als Index. Die folgende ergäbe:
123456% 10 = 6 (der Rest ist 6, wenn sie durch 10 dividiert)
123467 10% = 7 (der Rest ist, 7)
123450 10% = 0 (der Rest ist 0)
Diese Zahlen würden 6, 7 und 0 jeweils in die Anordnung an Positionen eingefügt werden. Es könnte wie folgt aussehen:
Die wichtige Sache mit dem Teilungsverfahren ist, dass die Schlüssel ganze Zahlen sind.
1.3 Was passiert, wenn die Tasten sind nicht ganze Zahlen?
Sie haben eine andere Hash-Funktion anzuwenden, um sie in ganzen Zahlen zu drehen. Effektiv, erhalten Sie zwei Hash-Funktionen in einem:- Funktion erhält eine ganze Zahl
- Funktion ein Hash-Verfahren von oben aufzubringen, einen Index zu einem Array zu erhalten
Was meinen wir, dass die Tasten sind nicht ganze Zahlen? Nun, lassen Sie uns sagen, dass die Schlüssel Die Namen sind. Sowie:
Sarah Jones
Tony Balognie
Tom Katz
Die Hash-Funktion hat zwei Dinge zu tun:
- Konvertieren Sie die Namen in ganzen Zahlen
-
Zum Beispiel haben wir eine Funktion, die eine Zeichenfolge in eine ganze Zahl dreht. Die Ergebnisse werden wie folgt aussehen:
Sarah Jones -> 1038
Tony Balognie -> 1259
Tom Katz -> 746 - Tragen Sie eine Hash-Methode einen Index zu erhalten
-
Wir können nun die Teilungsmethode anwenden, einen Index für eine Reihe von 10 Elementen zu erhalten
Sarah Jones -> 1038% 10 -> 8
Tony Balognie -> 1259% 10 -> 9
Tom Katz -> 746% 10 -> 6
1.4 Was würde das aussehen wie in der Matrix?
Das Array wird als Hash-Tabelle bekannt. Es speichert den Schlüssel (verwendet, um den Index zu finden) zusammen mit den zugehörigen Werten. In dem obigen Beispiel könnten wir eine Hash-Tabelle, die in etwa so aussah:
Auch hier ist die Idee, dass wir Einzelteile in die Hash-Tabelle einfügen den Schlüssel und Anwenden der Hash-Funktion (en), den Index zu erhalten verwenden.
Ein Problem tritt auf, wenn zwei Tasten, um den gleichen Index ergeben. Zum Beispiel, sagen wir schließen wollten:
John Smith -> 948% 10 -> 8
Wir haben eine Kollision, weil Sarah Jones bereits bei Array-Index 8 gespeichert ist.
Wir brauchen eine Methode, um diese zu lösen. Die Auflösung kommt, wie Sie Ihre Hash-Tabelle erstellen. Es zwei wichtige Ansätze in dem Buch:- linear Probing
- Verkettung
Die Details sind als Klasse Material verlassen, aber erkennen, dass in Verkettungs Sie eine Reihe von verknüpften Listen haben. Alle Daten in der „gleichen Link“ haben kollidiert Indexwerte.
Betrachten wir ein Diagramm des obigen Beispiels. Denken Sie daran, es zu einer Kollision mit Sarah Jones und John Smith war. Beachten Sie, dass John Smith „gekettet“ oder „verknüpft“ nach Sarah Jones.
1.5 Anwendungen von einer Hash-Tabelle
Hash-Tabellen sind gut in Situationen, in denen Sie enorme Datenmengen, aus denen Sie schnell mögen Suchen und Abrufen von Informationen. Einige typische Hash-Tabelle Implementierungen würden in den folgenden Situationen:1.6 Typische Operationen eines Hash Table
Die Funktionen im Zusammenhang mit unserer Implementierung der Hash-Tabelle sind die folgenden:Gibt true zurück, wenn die Hash-Tabelle ist leer. Ansonsten gibt false zurück
Gibt true zurück, wenn die Hash-Tabelle ist voll. Ansonsten gibt false zurück
NewDataItem Inserts in die entsprechende Liste in der Hash-Tabelle. Die Lage (Index), in der Hash-Tabelle wird von dem Schlüssel und der Hash-Funktion bestimmt.
Durchsucht die Hash-Tabelle für das Datenelement mit dem Schlüssel SearchKey. Wenn das Datenelement gefunden wird, entfernt dann das Datenelement und gibt true zurück. Andernfalls wird false zurückgegeben.
Durchsucht die Hash-Tabelle für das Datenelement mit dem Schlüssel SearchKey. Wenn das Datenelement gefunden wird, dann kopiert das Datenelement dataItem und gibt true zurück. Andernfalls wird false zurückgegeben.
Entfernt alle Datenelemente in der Hash-Tabelle.
Gibt die Datenelemente in einer Hash-Tabelle. Wenn die Hash-Tabelle leer ist, Ausgänge, "Empty-Hash-Tabelle". Dies wird für den Test / Debug-Zwecke gedacht.
2. Anwendung: Nachschlagen Passwörter
Im folgenden Abschnitt wird ein Algorithmus für das Kennwort eines Benutzers zu authentifizieren. Später im Labor Übung werden Sie das Skelett Code gegeben und baten Linien hinzuzufügen, damit es funktioniert.
Eine mögliche Verwendung für eine Hash-Tabelle ist Computer-Benutzer Login Benutzernamen und Passwörter zu speichern.
Es gibt zwei wichtige Schritte zu diesem Programm:- Das Programm wird Benutzername / Passwort-Sets aus der Datei password.dat laden und sie in die Hash-Tabelle einfügen, bis das Ende der Datei auf password.dat erreicht ist. Die password.dat Datei wird mit einem Benutzernamen / Passwort pro Zeile festgelegt wie folgt aussehen:
Lassen Sie sich in einigen Details füllen:
3. Laborübung
- Holen Sie sich die Dateien:
- Extrahieren Sie alle Dateien auf dem WORK. Öffnen Sie den WORK und doppelklicken Sie auf exercise.sln. Dadurch wird das Projekt öffnen. Es gibt sechs Dateien in diesem Programm verwendet:
- hashtbl.cpp und hashtble.h - enthalten, die Umsetzung der Hashtable-Klasse
- listlnk.cpp und listlnk.h - enthalten die Umsetzung der verkettete Listen Klasse
- login.cpp - das Hauptprogramm. Diese enthält die Passwort-Struktur, die in der Hash-Tabelle eingefügt wird.
- password.dat - enthält alle Benutzer und die entsprechenden Passwörter.
So beenden Sie das Programm von ausgeführt wird, bei der „Anmeldung:“ Eingabeaufforderung geben Sie CTRL und z (gleichzeitig) und dann die Enter-Taste.
- Ändern Sie die folgende Zeile ein, so dass Sie 8 Elemente in der Hash-Tabelle (statt 10): Was ist mit dem Hash-Tabelle geschieht? Warum?
- Bearbeiten Sie die Datei password.dat. Diese Datei wurde in das Projekt (im Solution Explorer unter „Resource Files“) hinzugefügt. Klicken Sie doppelt auf ihn zu öffnen.
Testplan für „Login“ Simulationsprogramm