44. Hashes

Pythons Dictionaries heißen in anderen Sprachen Hashes oder associative arrays. Sie sind kein Bestandteil von C oder der Standardbibliothek, werden aber von der glib implementiert.

Ein einfaches Python-Programm wie

myhash = {"Hallo":1,
  "Komisch":"Wert"}
print myhash["Hallo"]
print myhash.get("Hallo2", 0)
print myhash["Komisch"]

mit der Ausgabe

1
0
Wert

nimmt in C schon recht beängstigende Ausmaße an.

#include <glib.h>
#include <stdio.h>

int main(void)
{
  int aValue = 1;
  GHashTable *myhash = g_hash_table_new(g_str_hash, g_str_equal);

  g_hash_table_insert(myhash, "Hallo", &aValue);
  g_hash_table_insert(myhash, "Komisch", "Wert");
  printf("%d\n", *(int*)g_hash_table_lookup(myhash, "Hallo"));
  printf("%x\n", g_hash_table_lookup(myhash, "Hallo2"));
  printf("%s\n", (char*)g_hash_table_lookup(myhash, "Komisch"));
  return 0;
}

Von der glib kommt hier

  • der opake (d.h. undurchsichtige, die Benutzerin weiß nicht, woraus er aufgebaut ist) Typ GHashTable, und
  • die Funktionen g_hash_table_new, entspricht etwa myhash = {}
  • g_hash_table_insert, enspricht etwa myhash[key] = value
  • g_hash_table_lookup, entspricht etwa myhash[key]

Dabei kann g_hash_table_lookup natürlich keinen KeyError werfen, wenn key nicht im Hash ist. Stattdessen signalisiert sie die Fehlerbedingung auf C-Art durch Rückgabe von NULL.

Genau genommen haben wir noch die von der Bibliothek selbst definierten Callbacks g_str_hash und g_str_equal verwendet. Im Groben sagen sie, dass unser Hash tatsächlich Strings und nicht was anderes als Indizes verwendt.

Eine offensichtliche Anwendung für diese Hashes ist mal wieder das Wörterzählen. Im Anhang dieser Seite befindet sich Quellcode für ein Programm, das Wörter in der der Standardeingabe zählt. Darin befindet sich eine neue Funktion, strdup. Sie nimmt einen String als Argument und kopiert ihn in frisch allozierten Speicher. Wir brauchen das hier, weil die getNextWord-Funktion die Wörter in einem statischen Speicher zurückgibt – mehr dazu auf der nächsten Folie.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Holt euch die an diese Seite angehängten Dateien, versteht sie, kompiliert das Programm und probiert es aus. Schreibt ein Äquivalent in Python. Vergleicht Codelänge und Geschwindigkeit (und Einfachheit der Implementation).

Dateien zu diesem Abschnitt


Markus Demleitner

Copyright Notice