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:
Was könnte der einfachste Hash-Algorithmus sein, der in den meisten praktischen Fällen eine Kollisionsvermeidung gewährleistet?
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?
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?
Die folgende Seite enthält mehrere Implementierungen von Allzweck-Hash-Funktionen, die in C (und vielen anderen Sprachen) implementiert sind: partow.net/programming/hashfunctions/index.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
Arul
Hier ist ein schöner Überblick über die bemerkenswertesten bekannten Hash-Funktionen.
32bit sollte problemlos funktionieren.
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
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
14029800cookie-checkEine minimale Hash-Funktion für C?yes
Haben Sie darüber nachgedacht, GLib zu verwenden? developer.gnome.org/glib/2.46/glib-Hash-Tables.html
– Bastien Léonard
13. April 2009 um 14:08 Uhr
Die folgende Seite enthält mehrere Implementierungen von Allzweck-Hash-Funktionen, die in C (und vielen anderen Sprachen) implementiert sind: partow.net/programming/hashfunctions/index.html
– Matthias N.
31. Oktober 2010 um 23:06 Uhr