2016-07-29 11 views
0

Ich verwende Hash-Funktion auf Feature-String (wie Abfrage und Titel), um spärliche Feature-ID zu generieren. Diese Hash-Funktion sollte effizient sein und eine gute Verteilung auf uint64 oder uint32 haben. Kann mir jemand Empfehlungen geben? Ich habe zwei Methoden in Java getestet. Der erste ist Java-HashCode. Ich habe festgestellt, dass es viele Kollisionen mit ähnlichen Geohash-Saiten gibt. Der zweite ist Schlag. Es hat mehr Kollisionen als hashCode.Gute Hash-Funktion zum Generieren von Uint64 oder Uint32 Feature-ID in Sparse Machine Learning

public static long gene(String s) { 
     long hash = 5381; 
     int c; 
     for (int i = 0; i < s.length(); i++) { 
      c = s.charAt(i); 
      hash = ((hash << 5) + hash) + c; 
     } 
     return hash; 
    } 

(Bitte den Unterschied zwischen Java ignorieren lange und C++ uint. Alle fein)

+0

geohash verwendet einen reduzierten Alphabet. Generische Hash-Funktionen gehen oft von einer gleichmäßigen Verteilung der Zeichen aus. Daher sind viele Kollisionen zu erwarten. Ich würde die Geohash-Zeichenfolge vor dem Hashing in binäre Gegenstücke umwandeln. – Oncaphillis

Antwort

3

Sie können versuchen, Murmurhash und cityhash

+0

Diese Bibliothek unterstützt diese Hashes und ein paar mehr https://github.com/OpenHFT/Zero-Allocation-Hashing –

+0

Das ist, was ich wollte. Vielen Dank. – formath