Eine minimale Hash-Funktion für C?

Lesezeit: 3 Minuten

Ich kann boost:hash nicht verwenden, weil ich bei C bleiben muss und C++ nicht verwenden kann.

Aber ich muss eine große Anzahl (10.000 bis 100.000) von Token-Strings (5 bis 40 Bytes Länge) hashen, damit die Suche in diesen am schnellsten ist.

MD5, SHA1 oder jede lange Hash-Funktion scheint für eine einfache Aufgabe zu schwer zu sein, ich mache keine Kryptografie. Hinzu kommen die Speicher- und Rechenkosten.

Daher meine Frage:

  1. Was könnte der einfachste Hash-Algorithmus sein, der in den meisten praktischen Fällen eine Kollisionsvermeidung gewährleistet?

  2. Wie viele Bits sollen für den Hashwert verwendet werden? Ich entwickle für 32-Bit-Systeme. Verwendet der Hash-Algorithmus in Perl/Python auch 32-Bit-Hashes? Oder muss ich auf 64 springen?

  3. In Bezug auf die Implementierung von Hash-Tabellen in gängigen Skriptsprachen: Prüft die Implementierung auf Kollisionen oder kann ich diesen Teil ganz vermeiden?

Eine gute (und schnelle) Hash-Funktion und eine interessante Lektüre finden Sie unter http://www.azillionmonkeys.com/qed/hash.html

Die einzige Zeit, in der Sie nicht auf Kollisionen prüfen sollten, ist, wenn Sie einen perfekten Hash verwenden – eine gute altmodische Nachschlagetabelle, wie z gperf.

  • Ich würde vorschlagen, einen Blick auf einen zu werfen, den Hsiehs Analyse übersehen hat: MurmurHash2. en.wikipedia.org/wiki/MurmurHash

    – Steven Sudit

    10. Juli 2009 um 3:30 Uhr

Benutzeravatar von arul
Arul

  1. Hier ist ein schöner Überblick über die bemerkenswertesten bekannten Hash-Funktionen.

  2. 32bit sollte problemlos funktionieren.

  3. Sie müssen immer nach Kollisionen suchen, es sei denn, Sie möchten eine lustige Hashtabelle schreiben 🙂

  • Sie müssen nicht nach Kollisionen suchen, wenn es Ihnen egal ist, welche Antwort Sie erhalten. Der Vorteil ist, dass Sie den Originalschlüssel nicht in der Hash-Tabelle speichern müssen, sodass Sie viel Platz sparen können.

    – Zan Luchs

    13. April 2009 um 16:29 Uhr

  • Nun, solch ein nicht-deterministisches Verhalten meinte ich mit „lustig“.

    – Arul

    13. April 2009 um 16:39 Uhr

Benutzeravatar von TStamper
TStampfer

Eine allgemeine Hash-Funktion für Hash-Tabellensuche. Es spezifiziert NICHT für kryptografische Zwecke verwendenaber da Sie angegeben haben, dass Sie dies nicht beabsichtigen, sollten Sie in Ordnung sein.

Es ist inbegriffen Eine Übersicht über Hash-Funktionen ausprobieren

Wenn Sie auf einem posixähnlichen System arbeiten und sich an einfaches C halten, würde ich einfach verwenden, was das System bereits zu bieten hat. man 3 hcreate bietet Ihnen alle Details oder Sie finden hier eine Online-Version http://linux.die.net/man/3/hcreate

Versuchen Adler32 für lange Saiten bzw Murmeln2 für kurze Saiten.

  • Adler32 ist überhaupt kein sehr guter Hash. Tatsächlich ist es als Hash sogar noch schlimmer als CRC-32. Murmur2 hingegen ist ein sehr schneller Hash mit ausgezeichneter Verteilung und Worst-Case-Verhalten, sodass es keinen Grund gibt, seine Verwendung auf kurze Zeichenfolgen zu beschränken. Ich verstehe die Grundlage deines Ratschlags nicht wirklich.

    – Steven Sudit

    10. Juli 2009 um 3:28 Uhr

xxhash ist eine ziemlich schnelle und einfache Option. Ein einfacher Code würde verwenden XXH32 Funktion:

unsigned int XXH32 (const void* input, int len, unsigned int seed);

Es ist ein 32-Bit-Hash. Seit len ist intfür größere Daten mehr als 2^31-1 Bytes verwenden diese:

void*         XXH32_init   (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int  XXH32_digest (void* state);

  • Adler32 ist überhaupt kein sehr guter Hash. Tatsächlich ist es als Hash sogar noch schlimmer als CRC-32. Murmur2 hingegen ist ein sehr schneller Hash mit ausgezeichneter Verteilung und Worst-Case-Verhalten, sodass es keinen Grund gibt, seine Verwendung auf kurze Zeichenfolgen zu beschränken. Ich verstehe die Grundlage deines Ratschlags nicht wirklich.

    – Steven Sudit

    10. Juli 2009 um 3:28 Uhr

1402980cookie-checkEine minimale Hash-Funktion für C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy