Es gibt keine "gute Hash-Funktion" für universelle Hashes (Hrsg. Ja, ich weiß, es gibt so etwas wie "universelles Hashing", aber das habe ich nicht gemeint). Je nach Kontext bestimmen unterschiedliche Kriterien die Qualität eines Hash. Zwei Personen haben SHA bereits erwähnt. Dies ist ein kryptografischer Hash und überhaupt nicht gut für Hash-Tabellen, die Sie wahrscheinlich meinen.
Hash-Tabellen haben sehr unterschiedliche Anforderungen. Trotzdem ist es schwierig, eine gute Hash-Funktion allgemein zu finden, da unterschiedliche Datentypen unterschiedliche Informationen offenlegen, die gehasht werden können. Als Faustregel gilt, dass alle Informationen, die ein Typ enthält, gleichermaßen berücksichtigt werden. Dies ist nicht immer einfach oder sogar möglich. Aus Gründen der Statistik (und damit der Kollision) ist es auch wichtig, eine gute Verteilung über den Problemraum, dh alle möglichen Objekte, zu generieren. Dies bedeutet, dass es beim Hashing von Zahlen zwischen 100 und 1050 nicht gut ist, die höchstwertige Ziffer eine große Rolle im Hash spielen zu lassen, da diese Ziffer für ~ 90% der Objekte 0 ist. Es ist weitaus wichtiger, die letzten drei zu lassen Ziffern bestimmen den Hash.
Ebenso ist es beim Hashing von Zeichenfolgen wichtig, alle Zeichen zu berücksichtigen - es sei denn, es ist im Voraus bekannt, dass die ersten drei Zeichen aller Zeichenfolgen gleich sind. wenn man diese berücksichtigt, ist das eine Verschwendung.
Dies ist tatsächlich einer der Fälle, in denen ich rate, zu lesen, was Knuth in The Art of Computer Programming , vol. 3. Eine weitere gute Lektüre ist Julienne Walkers The Art of Hashing .