Was ist eine gute Hashfunktion?
Was ist eine gute Hashfunktion? Ich sah eine Menge von hash-Funktion und Anwendungen in meinem Datenstrukturen Kurse in der Schule, aber ich lernte vor allem, dass es ziemlich schwer eine gute hash-Funktion. Als Faustregel zur Vermeidung von Kollisionen mein professor sagte, dass:
function Hash(key)
return key mod PrimeNumber
end
(mod ist der % - operator in C und ähnlichen Sprachen)
mit der Primzahl zu sein, die Größe der hash-Tabelle. Ich verstehe, dass eine eigentlich gute Funktion, um Kollisionen zu vermeiden und ein schnelles, aber wie kann ich das machen, eine bessere ein? Ist es besser, hash-Funktionen für string-Schlüssel gegen numerischen Tasten?
Haben Sie in Betracht gezogen, indem eine oder mehrere der folgenden Allgemeinen Zweck von hash-Funktionen: partow.net/programming/hashfunctions/index.html
In der fnv_func, die Art von p[i] ist char, was passieren wird, mit h nach der ersten iteration? War alles in Zweck?
sagte: Es gibt eine Reihe von Informationen rund um hash-Funktionen in der wikipedia en.wikipedia.org/wiki/Hash_function und der Unterseite dieses Artikels partow.net/programming/hashfunctions/index.html hat algorithmen implementiert in verschiedenen Sprachen.
In der fnv_func, die Art von p[i] ist char, was passieren wird, mit h nach der ersten iteration? War alles in Zweck?
sagte: Es gibt eine Reihe von Informationen rund um hash-Funktionen in der wikipedia en.wikipedia.org/wiki/Hash_function und der Unterseite dieses Artikels partow.net/programming/hashfunctions/index.html hat algorithmen implementiert in verschiedenen Sprachen.
InformationsquelleAutor Hoffmann | 2008-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun die "normalen" hash-table-lookups für grundsätzlich jede Art von Daten - diese von Paul Hsieh ist die beste, die ich je benutzt habe.
http://www.azillionmonkeys.com/qed/hash.html
Wenn Sie sich sorgen über kryptographisch sichere oder sonst etwas Fortgeschrittener ist, dann YMMV. Wenn Sie wollen einfach nur ein kick ass general purpose hash-Funktion eine hash-Tabelle-lookup, dann ist dies, was Sie suchen.
Ich hatte gelesen von Jenkins' Website, die SFH ist eine der besten, aber ich denke, dass das Rieseln könnten besser machen, siehe diese ausgezeichnete Antwort: programmers.stackexchange.com/questions/49550/...
Was bedeutet YMMV?
Ihre Laufleistung Kann Variieren
Hsieh s hash-Funktion ist schrecklich, mit einer Größenordnung mehr Kollisionen, als wir wollen. Insbesondere strings, die unterscheiden sich nur in den letzten 4 bytes können kollidieren leicht. Wenn Sie haben ein 30-Zeichen-string, die sich in den letzten 4 bytes, nach 28 bytes Prozesse, die hashes unterscheiden sich nur in den letzten 2 bytes. Das bedeutet, dass Sie GARANTIERT eine Kollision für eines der restlichen zwei-byte-Werte. (Ja, es ist schnell. So was.)
InformationsquelleAutor Chris Harris
Gibt es keine solche Sache wie eine "gute hash-Funktion" für universal-hashes (ed. ja, ich weiß, es gibt so etwas wie ein "universelles hashing" aber das ist nicht das, was ich meinte). Je nach Kontext sind verschiedene Kriterien bestimmen die Qualität eines hash. Zwei Menschen, die bereits erwähnten SHA. Dies ist eine kryptographische hash-und das ist überhaupt nicht gut für die hash-Tabellen, die du wahrscheinlich meinst.
Hash-Tabellen haben sehr unterschiedliche Anforderungen. Aber trotzdem, das finden einer guten hash-Funktion universell ist schwer, da unterschiedliche Daten-Typen stellen verschiedene Informationen, können zerlegt werden. Als Faustregel ist es gut, zu überlegen alle Informationen, die ein type enthält gleichermaßen. Dies ist nicht immer einfach oder gar möglich. Aus Gründen der Statistik (und damit auch Konflikt), es ist auch wichtig zu generieren, die eine gute Streuung über das problem Raum, D. H. alle möglichen Objekte. Dies bedeutet, dass beim hashing zahlen, die zwischen 100 und 1050 es ist nicht gut, wenn sich die meisten signifikanten stellen spielen eine große Rolle in der hash-weil für ~ 90% der Objekte, ist diese Ziffer 0. Es ist viel mehr wichtig, dass Sie die letzten drei Ziffern bestimmen die hash.
Ähnlich wie beim hashing von strings ist es wichtig, betrachten Sie alle Charaktere – außer, wenn es im Voraus bekannt, dass die ersten drei Zeichen aller strings identisch sein; über diese wird dann eine Verschwendung.
Dies ist tatsächlich einer der Fälle, wo ich mich beraten zu Lesen, was Knuth zu sagen hat, in Die Kunst der Computer-Programmierung, vol. 3. Ein weiteres gutes Lesen ist Julienne Walker Die Kunst der Vermischung.
InformationsquelleAutor Konrad Rudolph
Gibt es zwei wichtige Zwecke von Hash-Funktionen:
Es ist unmöglich, zu empfehlen, eine hash-ohne zu wissen, was Sie verwenden es für.
Wenn Sie nur eine hash-Tabelle in einem Programm, dann brauchen Sie nicht zu befürchten, wie reversibel oder hackable der Algorithmus ist... SHA-1 und AES ist völlig unnötig für diese, Sie wären besser dran mit einem variation von FNV. FNV erzielt bessere dispersion (und somit weniger Kollisionen) als eine einfache prime mod wie du Sie erwähnt hast, und es ist mehr anpassungsfähig an unterschiedliche input-Größen.
Wenn Sie die hashes zu verstecken und zu authentifizieren, öffentliche Informationen (wie hashing ein Passwort, oder ein Dokument), dann sollten Sie eines der wichtigsten Hash-algorithmen geprüft, die von der öffentlichen Kontrolle. Die Hash-Funktion-Lounge ist ein guter Ort, um zu starten.
Wie gut funktioniert die FNV widerstehen Geburtstag Kollision im Vergleich zu, sagen, die gleiche Anzahl von bits aus einem SHA1?
Solange die avalanch Eigenschaften einer hash-gut (kleine änderungen im input = große änderungen in der Ausgabe), dann Geburtstag Kollisionen sind einfach eine Funktion der bits im hash. FNV-1a ist ausgezeichnet, in dieser Hinsicht, und Sie können so viele oder so wenige bits im hash-wie Sie wünschen (obwohl es dauert ein wenig zusätzlichen Aufwand, um eine bit-Zahl, die keine Potenz von 2 ist).
InformationsquelleAutor Myrddin Emrys
Dies ist ein Beispiel für eine gute und auch ein Beispiel dafür, warum würden Sie nie schreiben wollen.
Es ist ein Fowler /Noll /Vo (FNV) Hash, der zu gleichen teilen aus informatik-Genie und Reine voodoo:
Edit:
Sie segnen. Diese kurzen, einfachen, effizienten, generischen und wirksame 64-bit-hash-Funktion war genau das, was ich brauchte.
InformationsquelleAutor Nick Van Brunt
Ich würde sagen, dass die Faustregel ist, nicht Rollen Sie Ihre eigenen. Versuchen Sie, etwas zu benutzen, die gründlich getestet wurde, z.B. SHA-1 oder etwas entlang jenen Linien.
übrigens, auch wenn keine Kollisionen für SHA-1 gefunden wurden, es iss vermutlich eine Sache von Jahren oder Monaten, bevor man gefunden wird. Ich würde empfehlen die Verwendung von SHA-256.
InformationsquelleAutor Einar
Eine gute hash-Funktion hat die folgenden Eigenschaften:
Einem gegebenen hash einer Nachricht ist es rechnerisch unmöglich für einen Angreifer findet eine weitere Nachricht, so dass Ihre Hashwerte gleich sind.
Gegeben ein paar von Nachricht m' und m, ist es rechnerisch unmöglich, zu finden, zwei so, dass h(m) = h(m')
Beiden Fällen nicht das gleiche. Im ersten Fall gibt es bereits ein hash, dass Sie versuchen, eine Kollision zu finden. Im zweiten Fall werden Sie versuchen zu finden alle zwei Nachrichten, die kollidieren. Die zweite Aufgabe ist deutlich einfacher, wegen dem Geburtstag "paradox."
Wo ist die Leistung nicht so groß ein Problem, sollten Sie immer mit einem sicheren hash-Funktion. Es gibt sehr clevere Angriffe, die ausgeführt werden kann, zwingt Kollisionen in hash. Wenn Sie etwas stark von Anfang an, Sie sichern sich gegen diese.
Nicht mit MD5 oder SHA-1 in neuen designs. Die meisten Kryptographen, mich eingeschlossen, würden betrachten Sie gebrochen. Die grundlegende Quelle der Schwäche in beiden designs ist, dass die zweite Eigenschaft, die ich oben skizziert, nicht für diese Konstruktionen. Wenn ein Angreifer erzeugen kann, zwei Nachrichten m und m', die beide hash den gleichen Wert, den Sie verwenden können, diese Nachrichten gegen Sie. SHA-1 und MD5 leiden auch unter message-Erweiterung Angriffen, die tödlich Schwächen Ihrer Anwendung, wenn Sie nicht vorsichtig sind.
Ein moderneres hash wie Whirpool ist eine bessere Wahl. Es leidet darunter nicht, diese Nachricht extension Angriffe und verwendet die gleiche Mathematik wie AES verwendet, um zu beweisen Sicherheit gegen eine Vielzahl von Angriffen.
Hoffe, das hilft!
Warum? Was sind Ihre Gründe für die sagen, dass eine "kryptographische hash-Funktion ist eine wirklich schlechte raten in diesem Fall?" Warum ist es schlecht beraten? Was sind die relativen Nachteile, die das so machen?
da eine hash-Funktion, die verwendet wird in der hash-Karte sollte schnell sein und leicht (vorausgesetzt, es bietet immer noch gute hash), crypto-hashes explizit wurden Magd zu rechenintensiv, um zu verhindern, dass brute-force-Angriff.
InformationsquelleAutor Simon Johnson
Was Sie hier sagen, ist Sie wollen haben eine, die verwendet wird, weist Kollision Widerstand. Versuchen Sie es mit SHA-2. Oder versuchen Sie es mit einem (guten) Blockchiffre in eine Einweg-Komprimierung-Funktion (nie versucht, vor), wie AES in Miyaguchi-Preenel-Modus. Das problem mit diesem ist, dass Sie brauchen, um:
1) haben einen IV. Versuchen Sie, die ersten 256 bit der Nachkommastellen der Khinchin-Konstante oder so ähnlich.
2) eine Polsterung Schema. Einfach. Barrow ist es von einem hash wie MD5 oder SHA-3 (Keccak [Aussprache: 'ket-chak']).
Wenn Sie kümmern sich nicht um die Sicherheit (und ein paar andere gesagt), schau FNV oder lookup2 von Bob Jenkins (eigentlich bin ich der erste, der reccomends lookup2) Auch versuchen MurmurHash, es ist schnell (überprüfen Sie dies: .16 cpb).
InformationsquelleAutor Gavriel Feria