Design einer Hashtabelle



  • Hallo,
    ich muss gerade so etwas aehnliches wie einen B-Baum in C programmieren, wobei die einzelnen Kinder ueber eine Hashtabelle, die im Knoten enthalten ist, speichern.
    Das Problem an der Sache ist, die Schluessellaenge ist nicht fix, sondern kann sich sogar innerhalb des Programms aendern. (Pro Eintrag in der Hashtabelle gibt es auch immer garantiert einen Knoten bloss ..)
    Jetzt bin ich am Ueberlegen, wie ich am besten die Hashfunktion realisiere.
    Soll ich es machen, wie im Sedgewick beschrieben?
    Das saehe ja dann so aus:

    unsigned long hash(char *v) {
     long h;
     for(h = 0; *v != '\0'; v++) {
      h = (64 * h + *v) % M;
     }
     return h;
    }
    

    Da meine Hashtabellen aber ja nicht immer die gleiche laenge haben (ich kann allerdings sagen, dass die Eintraege nie ueber 2 ^ 32 theoretisch, und 2^16 praktisch theoretisch, und 2^8 "praktisch praktisch" wachsen), ueberlege ich jetzt, wie ich M (dass muss ja eine Primzahl sein, damit das moeglichst kollisionsfrei bleibt) ermittle (wobei das natuerlich moeglichst effizient und speichersparend sein soll).

    Da bin ich momentan etwas ratlos soll ich m einfach auf eine primzahl setzen, die dicht unter 2^32 liegt, und die realen anzahlen an eintraegen in der hashtabelle sind trotzdem bloss 4, 20 oder 32, oder soll ich M immer bezueglich der Hashtabellengroesse (keygroesse, maxanzahl der eintraege) waehlen?

    Was meint ihr?


Anmelden zum Antworten