Wahrscheinlichkeit von 64-bit-Hash-Code-Kollisionen
Dem Buch Numerical Recipes bietet eine Methode zur Berechnung der 64-bit-hash-codes, um die Zahl der Kollisionen reduzieren.
Ist der Algorithmus gezeigt, bei der http://www.javamex.com/tutorials/collections/strong_hash_code_implementation_2.shtml und kopiert wird hier zur Referenz:
private static final createLookupTable() {
byteTable = new long[256];
long h = 0x544B2FBACAAF1684L;
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 31; j++) {
h = (h >>> 7) ^ h;
h = (h << 11) ^ h;
h = (h >>> 10) ^ h;
}
byteTable[i] = h;
}
return byteTable;
}
public static long hash(CharSequence cs) {
long h = HSTART;
final long hmult = HMULT;
final long[] ht = byteTable;
final int len = cs.length();
for (int i = 0; i < len; i++) {
char ch = cs.charAt(i);
h = (h * hmult) ^ ht[ch & 0xff];
h = (h * hmult) ^ ht[(ch >>> 8) & 0xff];
}
return h;
}
Meine Fragen:
1) gibt es eine Formel zur Abschätzung der Wahrscheinlichkeit von Kollisionen unter Berücksichtigung der sogenannte Geburtstags-Paradoxon?
2) wie hoch schätzen Sie die Wahrscheinlichkeit einer Kollision (ich.e zwei Schlüssel, hash auf den gleichen Wert)? Sagen wir mal mit 1.000-Tasten und mit 10.000 keys?
BEARBEITEN: umformuliert/korrigierte Frage 3
3) Ist es sicher davon ausgehen, dass eine Kollision von einer angemessenen Anzahl von Tasten (sagen wir, weniger als 10.000 keys) ist so unwahrscheinlich, so dass, wenn 2 hash-codes sind die gleichen, können wir sagen, dass die Tasten sind die gleichen ohne weitere überprüfung? z.B.
static boolean equals(key1, key2) {
if (key1.hash64() == key2.hash64())
return true; //probability of collision so low we don't need further check
return false;
}
Dies ist nicht für die Sicherheit, aber die Ausführungsgeschwindigkeit ist zwingend erforderlich, damit die Vermeidung von weiteren Prüfungen der Tasten Zeit sparen. Wenn die Wahrscheinlichkeit so gering ist, sagen wir weniger als (1 in 1 Milliarde für 100.000 Schlüssel) wird es wahrscheinlich akzeptabel sein.
TIA!
InformationsquelleAutor isapir | 2014-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit dem Birthday Paradox Formel ist einfach sagt Ihnen, an welchem Punkt Sie anfangen müssen, sich Gedanken über eine Kollision passiert. Dies ist bei rund
Sqrt[n]
won
ist die gesamte Anzahl der möglichen hash-Werte. In diesem Falln = 2^64
so den Geburtstag Paradox Formel sagt Ihnen, dass, solange die Anzahl der Tasten ist deutlich weniger alsSqrt[n] = Sqrt[2^64] = 2^32
oder etwa 4 Milliarden, die Sie nicht brauchen, um über Kollisionen. Je höher dien
, desto genauer wird diese Schätzung. In der Tat ist die Wahrscheinlichkeitp(k)
, dass eine Kollision auftreten wird, mitk
Tasten Ansätze eine Schritt-Funktion, wien
größer wird, wo der Schritt erfolgt aufk=Sqrt[n]
.Vorausgesetzt, die hash-Funktion ist gleichmäßig verteilt, es ist einfach die Ableitung der Formel.
Diese Formel folgt direkt aus beginnend mit 1 key: Die Wahrscheinlichkeit, dass keine Kollision mit Taste 1 ist natürlich 1. Die Wahrscheinlichkeit, dass keine Kollision mit 2 Schlüsseln ist
1 * (n-1)/n
. Und so weiter für allek
Tasten. Bequem, Mathematica hat eine Pochhammer[] Funktion für diesen Zweck zum Ausdruck dieser lapidar:Dann, die Wahrscheinlichkeit zu berechnen, dass es mindestens 1 Kollision für
k
Tasten, subtrahieren von 1:Mithilfe von Mathematica, kann man berechnen für
n=2^64
:Zur Beantwortung dieser genau, hängt von der Wahrscheinlichkeit, dass 2 von den 10.000 keys identisch waren. Was wir suchen ist:
wo
a
undb
Schlüssel sind, die (möglicherweise identisch) undh()
ist die hashing-Funktion beinhalten. Wir können Bayes' Theorem direkt:Sehen wir sofort, dass
p(h(a)=h(b)|a=b) = 1
(wenna=b
dann natürlichh(a)=h(b)
), so erhalten wirWie Sie sehen können, hängt von
p(a=b)
was ist die Wahrscheinlichkeit, dassa
undb
sind eigentlich die gleichen Schlüssel. Dies hängt davon ab, wie die Gruppe von 10.000 keys ausgewählt wurden in den ersten Platz. Die Berechnungen für die letzten zwei Fragen übernehmen alle Tasten sind ausgeprägt, so dass mehr Informationen auf dieses Szenario wird benötigt, um vollständig zu beantworten.vielen Dank für eine ausgezeichnete Antwort. dies ist nicht eine Frage der Bequemlichkeit, sondern viel mehr eine Frage der Geschwindigkeit. es scheint, wie Kollision ist unwahrscheinlich, auch für 100.000 oder 1 Millionen keys (ich habe versucht die zu geben Sie Ihre Gleichung in WolframAlpha, aber konnte es nicht zu funktionieren).
Tut mir Leid, aber nur nach dem Lesen @WarrenDew 's Kommentar habe ich gemerkt, dass ich Durcheinander Frage 3 also bearbeitete ich es jetzt.
Über die step-Funktion: das Schlüsselwort ist Konzepte. Für jede endliche
n
, ist die Wahrscheinlichkeit Funktion einer Kollisionp(k)
ist monoton Steigend, so dassp(1)=0
undp(k)=1
fürk>n
. Alsn
unendlich sind,p(k)
Ansätze der Einheit step-Funktion, und der Schritt erfolgt aufk=Sqrt[n]
. Das ist einfach das mathematische Ergebnis der Anwendung precalculus Grenzenp(k)
(wenn auch etwas langwierig). Für Nummer 3, du hast Recht; ich antwortete auf die Frage der OP bedeutete zu Fragen. 🙂nochmals vielen Dank für eine hervorragende Antwort!
InformationsquelleAutor Matt
Finden Sie unter: Geburtstag Angriff.
Vorausgesetzt, die Verteilung der hashes ist einheitlich, die Wahrscheinlichkeit für eine Kollision für
n
Schlüssel ist ca. n2/265.Es ist nur sicher, wenn Sie Verwendung einer kryptographischen hash-Funktion. Auch wenn Sie tolerieren können, einen Fehler alle 3*1011 mal, können Sie haben die Möglichkeit zu erwägen, dass der Eingang ist speziell gebaut, um erstellen Sie eine hash-Kollision, als ein Angriff auf Ihr Programm.
InformationsquelleAutor Anton
Werde ich eine grobe Annäherung an die exakten Formeln in den anderen Antworten; die Annäherung kann in der Lage sein, um Ihnen zu helfen Antwort #3. Die grobe Näherung ist, dass die Wahrscheinlichkeit für eine Kollision Auftritt mit k-Tasten und n möglich, hash-Werte mit einem guten Hash-Algorithmus ist in etwa (k^2)/2n, für k << n ist. Für 100.000 keys mit 64 bit-hash, das ist 10^10 /32x10^18 oder etwa 1, 3 Milliarden.
Ich vermute aber, dass wenn Sie die Prüfung nicht die eigentlichen Schlüssel-Werte auf Kollision, es gibt eine größere chance, Sie ' ll finden Sie heraus, den Hash-Algorithmus ist nicht "gut" genug, nachdem alle.
InformationsquelleAutor Warren Dew
Die Wahrscheinlichkeit, eine einzige Kollision Auftritt, hängt von der set-Taste generiert die hash-Funktion ist einheitlich, die wir tun können folgenden die Wahrscheinlichkeit zu berechnen, dass die Kollision nicht Auftritt, die sich an die generation der k-Tasten wie folgt :-
Daher, wenn
sqrt(2^64)
Schlüssel, ist2^32
Schlüssel erzeugt es eine höhere chance, dass es einer einzelnen Kollision.Dies ist eine sehr interessante Frage, denn es hängt von der Größe des key space. Nehmen wir an, Ihr Schlüssel generiert zufällig aus dem Raum von
size = s
- und hash-Raum istx=2^64
wie Sie bereits erwähnt. Wahrscheinlichkeit einer Kollision istPc(k=n|x) = 1-e^(-n^2)/2x
. Wenn die Wahrscheinlichkeit der Wahl der gleiche Schlüssel im Schlüssel-Raum istP(k=n|s) = 1-e^(-n^2)/2s
. Für Sie, um sicher zu sein, dass, wenn hash gleich, dann Tasten sind die gleichen:-Daher zeigt es sich, dass für die Tasten zu gleich, wenn hash gleich, die Taste set-Größe muss kleiner als
2^64
ca sonst gibt es eine chance der Kollision in der hash-mehr als in key-set. Das Ergebnis ist unabhängig von der Anzahl der generierten Schlüssel.InformationsquelleAutor Vikram Bhat