Was ist Hashtabelle (Hash Table)?

Datenstruktur, die mit einer Hashfunktion aus einem Schlüssel eine Speicherposition berechnet und so Suchen, Einfügen und Löschen im Mittel in O(1) ermöglicht. Kollisionen, bei denen verschiedene Schlüssel auf dieselbe Position fallen, werden durch Verkettung (Chaining) oder offene Adressierung behandelt.

Japanische Bezeichnung: ハッシュテーブル

„Hashtabelle (Hash Table)“ kommt in 5 Übungsfragen aus 3 Themen vor, z. B. Datenstrukturen und Algorithmen, Wahrscheinlichkeitsrechnung, Statistik und Warteschlangen, Multicore und Synchronisation.

Fachgebiet: Datenstrukturen und Algorithmen

Funktionsweise und Behandlung von Kollisionen

Eine Hashtabelle wandelt einen Schlüssel mit einer Hashfunktion in eine ganze Zahl um und verwendet zum Beispiel deren Rest bei Division durch die Tabellengröße als Speicherposition. Es gibt weit mehr mögliche Schlüssel als Positionen, daher sind Kollisionen, bei denen verschiedene Schlüssel auf dieselbe Position fallen, unvermeidlich. Die Verkettung (Chaining) verbindet die Elemente derselben Position, zum Beispiel in einer verketteten Liste. Die offene Adressierung sucht eine andere freie Position innerhalb der Tabelle, etwa mit linearem Sondieren, das die Nachbarpositionen der Reihe nach prüft, oder mit doppeltem Hashing, das die Schrittweite mit einer zweiten Hashfunktion bestimmt.

Belegungsfaktor und Rehashing

Die Zahl der gespeicherten Elemente geteilt durch die Tabellengröße heißt Belegungsfaktor (Load Factor). Bei Verkettung ist die mittlere Listenlänge proportional zum Belegungsfaktor; bei offener Adressierung steigt die Zahl der Sondierschritte bis zu einem freien Platz stark an, wenn sich der Belegungsfaktor 1 nähert. Überschreitet der Belegungsfaktor einen gewählten Grenzwert, wird die Tabelle daher vergrößert, typischerweise auf etwa das Doppelte, und alle Elemente werden neu eingefügt (Rehashing). Ein Rehashing kostet O(n), doch da sich die Abstände zwischen den Vergrößerungen immer wieder verdoppeln, bleibt der Aufwand pro Einfügung bei amortisiert O(1).

Leistung und Fallstricke

Das mittlere O(1) setzt voraus, dass die Hashfunktion die Schlüssel gleichmäßig über die Tabelle verteilt. Eine schlechte Hashfunktion oder Eingaben, die gezielt Kollisionen erzeugen (ein Hash-Flooding-Angriff), können sie im schlechtesten Fall auf O(n) verlangsamen; Webserver und ähnliche Software verwenden daher Hashfunktionen, in die ein zufälliger Startwert einfließt. Eine Hashtabelle hält ihre Elemente außerdem nicht in sortierter Reihenfolge, daher eignen sich für Bereichssuchen und sortierte Auflistungen binäre Suchbäume oder B-Bäume besser. Die tatsächliche Geschwindigkeit hängt auch vom Cache-Verhalten ab: Verfahren, die benachbarte Plätze prüfen, wie das lineare Sondieren, sind oft schneller als die Verkettung, die Zeigern folgt.

Jetzt üben: Fragen zu Hashtabelle (Hash Table)

10 Schlüssel werden in eine Hashtabelle mit 100 Buckets eingefügt. Jeder Schlüssel wird unabhängig von den anderen mit gleicher Wahrscheinlichkeit einem der 100 Buckets zugeordnet. Wie groß ist der Erwartungswert der Anzahl der Schlüsselpaare, die demselben Bucket zugeordnet werden?

  1. A0,1
  2. B0,45
  3. C0,9
Antwort und Erläuterung anzeigen

Antwort: B. 0,45

Aus 10 Schlüsseln lassen sich 10C2 = 45 Paare bilden, und jedes Paar landet mit der Wahrscheinlichkeit 1/100 im selben Bucket. Wegen der Linearität des Erwartungswerts (der Erwartungswert einer Summe ist die Summe der Erwartungswerte) beträgt der Erwartungswert der Anzahl der Paare im selben Bucket 45 × 1/100 = 0,45. Die Linearität des Erwartungswerts gilt auch, wenn die Paare nicht voneinander unabhängig sind; es genügt daher, die Wahrscheinlichkeiten der einzelnen Paare zu addieren.

Welche Aussage beschreibt eine Kollision in einer Hashtabelle richtig?

  1. AAus dem Hashwert lässt sich der ursprüngliche Schlüssel ermitteln
  2. BVerschiedene Schlüssel ergeben denselben Hashwert (dieselbe Speicherposition)
  3. CDerselbe Schlüssel ergibt bei jeder Programmausführung einen anderen Hashwert
Antwort und Erläuterung anzeigen

Antwort: B. Verschiedene Schlüssel ergeben denselben Hashwert (dieselbe Speicherposition)

Eine Hashtabelle berechnet mit einer Hashfunktion aus dem Schlüssel eine Speicherposition und ermöglicht so Suchen, Einfügen und Löschen im Mittel in O(1). Da es weit mehr mögliche Schlüssel als Tabellenplätze gibt, lässt es sich nicht vermeiden, dass verschiedene Schlüssel auf dieselbe Position fallen (Kollision). Kollisionen werden daher mit Verfahren wie der Verkettung (Chaining), die die Elemente derselben Position zu einer Liste verbindet, oder der offenen Adressierung, die eine andere freie Position sucht, behandelt. Derselbe Schlüssel muss immer denselben Hashwert ergeben, sonst würde die Suche scheitern; ob sich der Schlüssel aus dem Hashwert zurückgewinnen lässt, ist eine Eigenschaft, die bei kryptografischer Verwendung zählt, und hat mit Kollisionen nichts zu tun.

Häufige Fragen

Wie hängen Hashtabellen und Hashfunktionen zusammen?

Eine Hashfunktion berechnet aus einem Schlüssel einen Wert in einem festen Bereich, und eine Hashtabelle ist eine Datenstruktur, die damit Speicherpositionen berechnet. Hashfunktionen für Hashtabellen legen Wert auf Geschwindigkeit und gleichmäßige Verteilung und brauchen üblicherweise keine Einwegeigenschaft wie kryptografische Hashfunktionen.

Wo werden Hashtabellen verwendet?

Überall dort, wo Werte schnell über einen Schlüssel nachgeschlagen werden müssen, etwa für Dictionaries (assoziative Arrays) und Sets in Programmiersprachen, Symboltabellen in Compilern, Hash-Joins und Hash-Indizes in Datenbanken sowie die Verwaltung von Caches.

„Hashtabelle (Hash Table)“ in den Erläuterungen

Fragen mit „Hashtabelle (Hash Table)“ (5)

  1. 10 Schlüssel werden in eine Hashtabelle mit 100 Buckets eingefügt. Jeder Schlüssel wird unabhängig von den anderen mit gleicher Wahrscheinlichkeit einem der 100 Buckets zugeordnet. Wie groß ist der Erwartungswert der Anzahl der Schlüsselpaare, die demselben Bucket zugeordnet werden?
  2. Welche Aussage beschreibt eine Kollision in einer Hashtabelle richtig?
  3. In einer Hashtabelle der Größe 7 (Positionen 0 bis 6) werden mit der Hashfunktion h(k) = k mod 7 die Schlüssel 10, 17, 24 und 3 in dieser Reihenfolge gespeichert. Kollisionen werden durch lineares Sondieren aufgelöst, das jeweils eine Position weiterrückt (nach 6 folgt 0), bis ein freier Platz gefunden ist. An welcher Position wird der Schlüssel 3 gespeichert?
  4. Warum ist bei einer Hashtabelle mit vielen Elementen und einem Belegungsfaktor von etwa 0,5 die offene Adressierung mit linearem Sondieren am ehesten schneller als die Verkettung (Verbinden der Elemente durch verkettete Listen)?
  5. Welche Aussage im Vergleich von „grobkörnigem Sperren“, bei dem eine gesamte große Datenstruktur mit einer Sperre geschützt wird, und „feinkörnigem Sperren“, bei dem Teile mit getrennten Sperren geschützt werden, ist richtig?

Verwandte Begriffe

Hashfunktion Erwartungswert Prefetching Zeiger (Pointer) Zeitkomplexität (O-Notation) Binäre Suche (Binary Search) Binärer Heap (Binary Heap) Binärer Suchbaum (Binary Search Tree) Breitensuche (Breadth-First Search) Dijkstra-Algorithmus

Zur Glossarübersicht