Generieren einer Ganzzahl basierend auf einer gegebenen Zeichenfolge (ohne GetHashCode)

8

Ich versuche eine Methode zu schreiben, um eine Ganzzahl basierend auf einer gegebenen Zeichenkette zu erzeugen. Wenn ich diese Methode für 2 identische Zeichenfolgen aufruft, muss die Methode die gleiche exakte Ganzzahl beide Male erzeugen.

Ich habe versucht, .GetHasCode () zu verwenden, aber das ist sehr unzuverlässig, sobald ich das Projekt auf eine andere Maschine verschiebe, da GetHasCode () verschiedene Werte für die gleiche Zeichenfolge zurückgibt

Es ist auch wichtig, dass die Kollisionsrate SEHR niedrig ist. Eigene Methoden, die ich bisher geschrieben habe, erzeugen Kollisionen nach nur wenigen hunderttausend Datensätzen.

Der Hashwert MUSS eine ganze Zahl sein. Ein String-Hash-Wert (wie MD5) würde mein Projekt in Bezug auf Geschwindigkeit und Ladeaufwand verkrüppeln.

Die Integer-Hashes werden verwendet, um extrem schnelle Textsuchen durchzuführen, was ich wunderbar funktioniert habe, aber es beruht derzeit auf .GetHasCode () und funktioniert nicht, wenn mehrere Maschinen beteiligt sind.

Jede Einsicht würde sehr geschätzt werden.

    
mrb398 11.11.2014, 17:00
quelle

3 Antworten

6

MD5-Hashing gibt ein Bytearray zurück, das in eine Ganzzahl konvertiert werden kann:

%Vor%

Sie konvertieren natürlich von einem 128-Bit-Hash in einen 32-Bit-Int, so dass einige Informationen verloren gehen, die die Wahrscheinlichkeit von Kollisionen erhöhen. Sie könnten versuchen, den zweiten Parameter auf ToInt32 einzustellen, um zu sehen, ob bestimmte Bereiche des MD5-Hash weniger Kollisionen als andere für Ihre Daten erzeugen.

    
Rudism 11.11.2014, 17:26
quelle
4

Wenn Ihr Hash-Code "nach ein paar hunderttausend Datensätzen" Duplikate erstellt, haben Sie eine ziemlich gute Hash-Code-Implementierung.

Wenn Sie Mathe machen , werden Sie feststellen, dass eine 32 -Bit-Hash-Code hat eine 50% ige Chance, nach etwa 70.000 Datensätzen ein Duplikat zu erstellen. Die Wahrscheinlichkeit, ein Duplikat nach einer Million Datensätzen zu erzeugen, ist so nahe wie möglich, um keine Rolle zu spielen.

Als Faustregel gilt, dass die Wahrscheinlichkeit, einen doppelten Hash-Code zu generieren, 50% beträgt, wenn die Anzahl der gehashten Datensätze der Quadratwurzel der Anzahl der möglichen Werte entspricht. Mit einem 32-Bit-Hash-Code, der 2 ^ 32 mögliche Werte hat, ist die Wahrscheinlichkeit, ein Duplikat zu erzeugen, 50% nach ungefähr 2 ^ 16 (65.536) Werten. Die tatsächliche Nummer ist etwas größer - näher bei 70.000 - aber die Faustregel bringt Sie in den Ballpark.

Eine andere Faustregel besagt, dass die Chance, ein Duplikat zu generieren, fast 100% beträgt, wenn die Anzahl der Hash-Elemente viermal so hoch ist wie die Quadratwurzel. Mit einem 32-Bit-Hash-Code ist es fast garantiert, dass eine Kollision auftritt, nachdem nur 2 ^ 18 (262.144) Datensätze gehashed wurden.

Das wird sich nicht ändern, wenn Sie das MD5 verwenden und es von 128 Bit auf 32 Bit konvertieren.

    
Jim Mischel 11.11.2014 18:30
quelle
-1

Dieser Code bildet eine beliebige Zeichenkette zwischen 0 und 100

ab %Vor%     
user3706939 04.10.2017 11:18
quelle

Tags und Links