Erzeugen Ganzzahl, basierend auf einer gegebenen Zeichenfolge (ohne GetHashCode)
Ich bin versucht zu schreiben, eine Methode zu generieren, die eine Ganzzahl, basierend auf einer gegebenen Zeichenfolge. Beim Aufruf dieser Methode auf 2 identische strings, die ich brauche, die Methode zu generieren, die genau die gleiche integer-beide Male.
Versuchte ich mit .GetHasCode() aber das ist sehr unzuverlässig, einmal Verschiebe ich das Projekt auf einem anderen Rechner, als GetHasCode() liefert verschiedene Werte für die gleiche Zeichenfolge
Ist es auch wichtig, dass das kollisionsrisiko SEHR gering. Benutzerdefinierte Methoden, die ich geschrieben habe, bisher produzieren Kollisionen nach nur ein paar hundert tausend Datensätze.
Den hash-Wert MUSS eine ganze Zahl sein. Ein string-hash-Wert (wie md5) lahmlegen würde mein Projekt in Bezug auf die Geschwindigkeit und Aufwand zum laden.
Den integer-hashes werden verwendet, um extrem schnelle Volltextsuche, die ich an der Arbeit ist schön, aber er verlässt sich auf .GetHasCode() und funktioniert nicht wenn mehrere Maschinen zu engagieren.
Jede Einsicht würde überhaupt sehr geschätzt werden.
- Haben Sie implementiert ein bekannter Algorithmus wie vorgeschlagen, hier?
- Gibt es Einschränkungen bei der string-Struktur (Größe, Codierung)?
- Es gibt keine Einschränkungen pro sagen, aber jeder gegebenen Zeichenfolge nicht mehr als Einhundert Zeichen oder so.
- Sie wollen einen hash-code, einfach nicht .NET-Implementierung (da kann es variieren). So scheint es mir, sollten Sie recherchieren hash-code-Implementierungen, um eine zu finden, die nicht Ihren Bedürfnissen entsprechen. Wenn .NET
GetHashCode()
ist sonst für Ihre Bedürfnisse geeignet, man könnte sogar dekompilieren (eine version davon) und Kapseln Sie in einer privaten Umsetzung, so dass Sie wissen, es wird sich nichts ändern. Wenn das nicht funktioniert, sollten Sie Ihre Forschung zu tun und dann kommen SO mit Ihnen mit spezifischen Fragen, die vielleicht kommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
MD5-hashing gibt ein byte-array umgewandelt werden kann, um einen integer:
Natürlich, der Konvertierung von einem 128-bit-hash, der auf einen 32 bit int, so dass einige Informationen verloren gehen, die erhöhen die Wahrscheinlichkeit von Kollisionen. Sie könnten versuchen, Einstellung der zweite parameter
ToInt32
um zu sehen, ob bestimmte Bereiche der MD5-hash erzeugen weniger Kollisionen als andere für Ihre Daten.Wenn Ihre hash-code erstellt Duplikate "nach ein paar hundert tausend Datensätze," Sie haben eine ziemlich gute hash-code-Implementierung.
Wenn Sie die Mathematik zu tun,, werden Sie feststellen, dass ein 32-bit-hash-code hat eine chance von 50% das erstellen eines Duplikats nach etwa 70.000 Datensätze. Die Wahrscheinlichkeit der Erzeugung eines doppelten, nach einer million Datensätzen ist so nahe an Gewissheit als nicht mehr so wichtig.
Als Faustregel gilt, dass die Wahrscheinlichkeit der Erzeugung eines doppelten hash-code ist 50%, wenn die Anzahl der Datensätze Hash ist gleich der Quadratwurzel aus der Anzahl der möglichen Werte. Also mit einem 32-bit-hash-code, die hat 2^32 mögliche Werte, die chance erzeugen ein Duplikat ist zu 50% nach ungefähr 2^16 (65.536 ist) Werte. Die tatsächlichen Anzahl ist etwas größer-näher zu 70.000--aber die Faustregel bekommt man in der ballpark.
Andere Faustregel ist, dass die Wahrscheinlichkeit der Erzeugung eines Duplikats ist fast 100%, wenn die Anzahl der Elemente gehasht ist vier mal die Quadratwurzel. Also mit einer 32-bit-hash-code, den Sie sind fast garantiert, um eine Kollision nach nur 2^18 (262,144) Datensätze Hash.
Das ist nicht zu ändern, wenn Sie die MD5 und konvertieren Sie es von 128 bits auf 32 bits.
Dieser code anzeigen beliebiger string, int zwischen 0-100
BigInteger erfordert Org.BouncyCastle.Mathematik