Sucht man nun das zu einem Schlüssel gehörige Element, so berechnet man wieder den Hash des Schlüssels und durchsucht den entsprechenden Bucket.
Die beiden wichtigen Kriterien für die Performance einer speziellen Implementierung ist die Qualität der Hashfunktion und die Anzahl der Buckets. Bei einer schlechten Hashfunktion wird ein Teil der Buckets leer gelassen oder nur schlecht ausgenutzt. Ist die Anzahl der Buckets im Verhältnis zu den eingefügten Werten zu gering, kommt es selbst bei einer optimalen Hashfunktion zu
|
In einer guten Implementation kann das Einfügen, Löschen und Auffinden von Schlüsseln immer in asymtotisch konstanter Zeit erledigt werden.
Im Gegensatz zu baumartigen Strukturen ist die Implementierung einer Hashtabelle einfacher und flexibler, da beliebige Schlüssel verwendet werden können. Dafür müssen die Buckets vorab schon alloziert werden und die Performance der Tabelle ist stark von der Qualität der Hashfunktion, sowie von den auftretenden Schlüsseln abhängig.
HashTabellen sind eine häufige Implementierung von Mappings (kurz "Maps" auch Dictionaries oder assoziatives Array genannt) und Sets.
Perl-Beispiel |
Die assoziativen Arrays in perl werden mittels einer Hashtabelle verwaltet. Daher werden sie im Jargon als "hashes" bezeichnet.
|
Die Initialisierung des assoziativen Arrays könnte auch vereinfacht als
|
|
D. h. oben wird die Hashtabelle aus einer Liste (Perl-Bezeichnung für einen Array befüllt. Diese Transformation geht jederzeit in jede Richtung:
|
Nachdem die Inhalte von Arrays und Hashes nicht nur Einzelwerte (Skalare= Strings oder Zahlen), sondern wiederum auch Arrays und Hashes sein können, stehen hier Strukturierungssysteme zur Verfügung, die mindestens so universell, aber leichter zu handhaben sind wie die klassischen LISP-Listen.
Optimierungsmöglichkeiten |
In manchen Situationen kann die Implementierung eines LRU-Algorithmus auf die Link-Listen etwas Performance bringen.
Wenn die Keys statisch bekannt sind (z. B. die keywords einer Programmiersprache), dann kann man eine perfekte HashFunktion suchen, die keine Kollisionen erzeugt und im Idealfall 100% Befüllungsgrad aufweist. Es gibt Programme, die dabei helfen (z. B. gperf).
Allgemeines |
HashTabellen haben sich als so flexible und praktische Datenstrukturen herausgestellt, dass viele moderne Sprachen (Perl, PHP, Python, Ruby, D, ...) sie als Primitives in ihren Sprachumfang integrieren. Das vereinfacht die Handhabung, erhöht die Performance und lässt auch eine einfache statische Initialisierung zu.