Hash.pas

Hierbei handelt es sich um eine Hashklasse die mit hilfe einer simplen Hashfunktion die Werte in internen Struktur abspeichert und wieder auslesen kann. Der ein oder andere wird sich jetzt denken "Wozu brauch man denn so etwas überhaupt?". Die Antwort darauf ist recht simple. Man brauch so etwas genau dann, wenn man Wertepaare abhängig von derem Namen abspeichern möchte. Und das dann noch mit einer angemessenen Geschwindigkeit. Der klassischen Fall wo so etwas zu Einsatz kommt ist ein Kompiler. Er muss intern die Variablen anhand deren Namem verwalten.

In der Unit Hash.pas sind 2 Klassen vertreten (TStringHash und TIntegerHash). Diese beiden Klassen unterscheiden sich lediglich dadurch, dass sie für Unterschiedliche Typen geschrieben wurden. Ein mal für String und das andere mal für Integer. Intern arbeiten beide Klassen 100%tig identisch.

Hier einmal die Funktionserklärung für die Klasse TStringHash.

constructor Create(const StartHashEntrys: Integer);

Konstruktor der Klasse. StartHashEntrys gibt die Größe des HashArrays an. Eine spätere Änderung dieses Arrays ist nicht möglich, da dies sonst die Daten zerstören würde. Um die Größe des HashArrays richtig zu wählen empfielt sich die maximale Anzahl der Einträge durch 2 oder 3 zu rechnen und diesen Wert als Größe festzulegen.

Wichtig!!! Eine zu kleine Größe dieses Arrays (1) würde zur Folge haben, dass alle Einträge in einer verketeten Liste abgelegt werden würden. Und somit wäre jeglicher Geschwindigkeitsvorteil hinüber. Ein zu größer Wert (10.000.000) würde logischerweise viel zu viel Speicher verbrauchen. Also ein wenig damit rumspielen kann leben retten oder so.

Sollte man das Hash dennoch dynamisch vergrößern müssen so gibt es keine andere Wahl als eine zweite Kopie davon zu erstellen und alle Werte mittels Get und Add zu übertragen.

destructor Destroy;

Destruktor. Gibt das Ganze wieder frei. Im Hash abgelegte Pointer werden nicht von alleine frei gegeben.

procedure Add(const Name: String; const Value: Pointer);

Fügt ein Element der Klasse hinzu. Als Wert wird immer ein Pointer verlangt.

procedure Clear;

Hiermit wird das Hash komplett auf den Anfangszustand zurück gesetzt. Also komplett leer. Auch hier werden abgelegte Pointer nicht von alleine wieder frei gegeben.

property Count: Integer read F_Count;

Gibt die Anzahl der hinzugefügten Elemente zurück.

procedure Delete(const Name: String);

Diese Methode löscht das Element mit dem Namen Name. Gleiches kann auch erreicht werden in dem Add mit dem Wert nil aufgerufen wird. Siehe Clear. Pointer werden auch hier nicht von alleine frei gegeben.

function Get(const Name: String): Pointer;

Wie der Name schon sagt gibt diese Methode den Pointer von dem Element mit dem Namen Name zurück. Bei einem nicht existierenden Element wird nil zurück gegeben.

procedure GetNames(const NameList: TStrings);

Diese Methode füllt die Liste mit den Namen der im Hash befindlichen Elemente. Aber auch nur die Namen! Außerdem hat die resultierende List keinen Anspruch darauf sortiert zu sein. Alle Einträge werden so hinzugefügt wie sie gerade gefunden werden.

procedure GetValues(const ValueList: TList);

Dies ist das Gegenstück zu GetNames. Sie liefert allerdings nur die gespeicherten Pointer zurück. Es besteht anhand der beiden Listen keinerlei Möglichkeit die Zugehörigkeit der einzelnen Einträge fest zu stellen.

function StrToPos(const Name: String): Integer

Diese interne Methode ist das eigentlich Herzstück der Klasse. Sie berechnet anhand des Textes (Zahl) die zugehörige Position im HashArray.

Download

Aktuelle Version: 1.0 (07-07-2003)