August 12, 2011 0

Hashtables optimieren

By in VB.NET

Eine Hashtable ist schon eine feine Sache: Objekt nehmen, ihm einen Schlüssel zuweisen und anschließend das Ganze in die Hashtable schieben.

Will man nun das Objekt wieder abfragen, muss man der Hashtable nur den vorher definierten Schlüssel übergeben und erhält im Tausch das Objekt zurück.

Jetzt werden Sie sagen: „Das kenne ich so aber schon von anderen Datenstrukturen – warum wird darüber ein so großes Tam-Tam gemacht?“

Da haben Sie durchaus recht, Abfragen mit alphanumerischen Schlüsseln können viele Datenstrukturen. Was die Hashtable aber so besonders macht, ist die Technik die im Verborgenen arbeitet: Diese sorgt dafür, dass eine Suchanfrage bei wachsender Eintragsmenge nicht jeden Eintrag überprüft, sondern (dank des Schlüssels) gezielt an die richtige Stelle gesprungen wird.

Für die Praxis heißt das: Wo Listen oder andere Datenstrukturen anfangen zu schwächeln, spielt die Hashtable ihre Qualitäten voll aus und skaliert mühelos bei wachsender Eintragsmenge.

Na dann ist ja Alles super – oder etwa nicht?


Auch Visual Basic .net verfügt über eine Hashtable-Klasse. Diese deckt auch die oben beschriebene Funktionalität ab. Ein paar Dinge mir mit zunehmender Nutzung negativ aufgefallen:

  • Eine Iteration durch alle Elemente ist nicht vorgesehen.
    Nehmen wir den Fall, Sie haben eine Hashtable mit jeder Menge Daten gefüllt. Jetzt wollen Sie alle Einträge auf ein bestimmtes Kriterium überprüfen und gegebenenfalls einzelne Elemente entfernen.

Folgendes funktioniert nicht (problemlos):

  • Mit einer For-Each-Schleife durch alle Objekte iterieren.
    Spätestens beim Löschen fliegt Ihnen dieser Ansatz um die Ohren, da versucht wird in der veränderten Hashtable weiter zu iterieren.
  • Mit einer For-Schleife nacheinander alle Objekte aufrufen:
    Die Elemente einer Hashtable lassen sich nicht per Index aufrufen – Pech gehabt!
  • Eine Funktion zum automatischen Überschreiben/Hinzufügen existiert nicht:
    Sie müssen jedes Mal, bevor Sie einen einen neuen Eintrag inzufügen, prüfen, ob nicht bereits ein Eintrag mit dem selben Schlüssel exisitert. Denn der wird nicht etwa überschrieben, stattdessen wird ein äußerst häßlicheException geworfen.
  • Wenn man einen leeren Schlüssel übergibt knallts!
    Die scheinbar harmlose Überprüfung, ob ein Schlüssel vergeben ist mit der contains-Methode führt zu einem fiesen Fehler, wenn der Schlüssel NOTHING ist (also auch ein leerer String!).
  • Typsicherheit ist ein heikles Thema:
    Sowohl die Schlüssel, als auch die hinterlegten Objekte können verschiedene Typen haben. Man weiß also nie, was man kriegt.

An sich scheinen die obigen Punkte noch recht tollerabel. Wenn man aber bedenkt, dass Hashtables in der Regel häufig aus Schleifen heraus angesprochen werden, ist es besonders ärgerlich, wenn wegen einem “problematischen” Aufruf ein Fehler produziert und der Schleifendurchlauf beendet wird.

Aus diesen Gründen habe ich mich für eines meiner Projekte entschieden eine Wrapper-Klasse zu schreiben. Für die Typsicherheit fehlt mir leider im Moment die Zeit, da dies ein wenig Einarbeitungszeit bedeuten würde. Ich freue mich über Verbesserungs- und Erweiterungsvorschläge jeder Art.

Die fertige Hashtable werde ich in naher Zukunft hier zum kostenlosen Download bereitstellen.

Leave a Reply