Wie bewerte ich die Hash-Kollisionswahrscheinlichkeit?
Entwickle ich ein back-end-Anwendung für die Suche. Die Suche nach system kopiert die Dateien in ein temporäres Verzeichnis und gibt Sie zufällige Namen. Dann geht es um die temporären Dateien' Namen meiner Anwendung. Meine Anwendung muss jede Datei, die in einem begrenzten Zeitraum, sonst ist es abgeschaltet - das ist ein watchdog-wie Sicherheitsmaßnahme. Verarbeitung von Dateien wird wahrscheinlich zu lange dauern, also muss ich das design der Anwendung in der Lage Umgang mit diesem Szenario. Wenn meine Anwendung wird heruntergefahren nächste mal die such-system will-index die gleiche Datei, es wird wahrscheinlich gibt es einen anderen temporären Namen.
Ist die offensichtliche Lösung ist, um eine Zwischenschicht zwischen dem Suchsystem und dem backend. Es wird in die Warteschlange der Anfrage an das backend weitergeleitet und warten auf das Ergebnis zu kommen. Wenn die Anfrage mal in die Zwischenschicht - kein problem, das backend weiter arbeiten, nur die Zwischenschicht ist neu gestartet und es abrufen kann, das Ergebnis aus dem backend, wenn der Antrag später wiederholt von der Suche nach system.
Das problem ist, wie zur Identifizierung der Dateien. Ihre Namen ändern sich nach dem Zufallsprinzip. Ich beabsichtige, verwenden Sie eine hash-Funktion wie MD5-hash der Datei-Inhalte. Ich bin mir bewusst, das Geburtstag paradox und verwendet eine Schätzung aus dem verlinkten Artikel, um die Berechnung der Wahrscheinlichkeit. Wenn ich davon ausgehe ich habe nicht mehr als 100 000-Dateien, die Wahrscheinlichkeit, dass zwei Dateien mit demselben MD5 (128 bit) ist etwa 1,47x10-29.
Sollte ich Pflege solche Kollisions-Wahrscheinlichkeit, oder einfach davon ausgehen, dass der gleiche hash-Werte bedeuten, dass gleich der Inhalt der Datei?
InformationsquelleAutor der Frage sharptooth | 2009-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gleich hash "gleich" bedeutet-Datei, es sei denn, jemand bösartig ist Herumspielen mit Ihren Dateien und injizieren von Kollisionen. (dies könnte der Fall sein, wenn Sie heruntergeladen Dinge aus dem internet) Wenn das der Fall ist gehen Sie für einen SHA2-basierte Funktion.
Gibt es keine zufälligen MD5-Kollisionen, 1,47x10-29 ist ein wirklich wirklich wirklich kleine Anzahl.
Zur überwindung des Problems der Aufbereitung von großen Dateien würde ich einen 3-phased-Identität Regelung.
Also, wenn Sie sehen, eine Datei mit einer neuen Größe, die Sie für bestimmte wissen, die Sie nicht haben, ein Duplikat. Und so weiter.
InformationsquelleAutor der Antwort Sam Saffron
Ich denke, man sollte es nicht.
Allerdings sollten Sie, wenn Sie haben die Vorstellung von zwei gleiche Dateien mit unterschiedlichen (echten Namen, nicht auf md5-Basis). Wie, auf der Suche nach system zwei Dokument möglicherweise haben genau denselben Inhalt, aber unterschieden, denn Sie befinden sich an verschiedenen stellen.
InformationsquelleAutor der Antwort alamar
Nur weil die Wahrscheinlichkeit ist 1/X, es bedeutet nicht, dass es wird Ihnen nicht passieren, bis Sie X Datensätze. Es ist wie in der Lotterie, sind Sie wahrscheinlich nicht zu gewinnen, aber jemand gibt wird gewinnen.
Mit der Geschwindigkeit und Leistungsfähigkeit von Computern in diesen Tagen (auch nicht über Sicherheit reden, nur Zuverlässigkeit) gibt es wirklich keinen Grund mehr nicht nur einen größeren/besseren hash-Funktionen als MD5 für etwas kritisch. Stepping bis zu SHA-1 soll Ihnen helfen, besser schlafen in der Nacht, aber wenn Sie wollen besonders vorsichtig gehen Sie dann zu SHA-265 und denke nie an Sie wieder.
Wenn die performance ist wirklich ein Problem, dann verwenden Sie BLAKE2, die ist tatsächlich schneller als MD5, aber unterstützt 256+ bits, um Kollisionen weniger wahrscheinlich, während mit gleichen oder besseren Leistung. Jedoch, während BLAKE2 wurde gut angenommen, es würde wahrscheinlich erfordern das hinzufügen einer neuen Abhängigkeit zu Ihrem Projekt.
InformationsquelleAutor der Antwort ColinM
Kam ich mit einer Monte-Carlo-Ansatz, um in der Lage zu schlafen sicher, während die Verwendung der UUID für verteilte Systeme, die zu serialisieren, ohne Kollisionen.
drucken würde so etwas wie:
Hörte ich die Formel vor: Wenn Sie zum speichern von log(x/2) - Tasten verwenden Sie eine Hash-Funktion, die mindestens Schlüsselraum e**(x).
Wiederholte Experimente zeigen, dass für eine Bevölkerung von 1000 Protokoll - -20 Plätze, Sie manchmal eine Kollision so früh wie log(x/4).
Für uuid4 die 122 bits, das heißt, ich Schlaf sicher bei mehreren Computern pick random uuid ' s bis ich über die 2**31 items. Peak-Transaktionen in das system, das ich bin denken ist etwa 10-20 Ereignissen pro Sekunde, ich bin bei einem Durchschnitt von 7. Das gibt mir ein Betriebssystem-Fenster von etwa 10 Jahren, gegeben, dass die extreme paranoia.
InformationsquelleAutor der Antwort Árni St. Sigurðsson
Hier ist ein interaktiver Rechner, können Sie die Schätzung der kollisionswahrscheinlichkeit für alle hash-Größe und Anzahl der Objekte - http://everydayinternetstuff.com/2015/04/hash-collision-probability-calculator/
InformationsquelleAutor der Antwort Ghostrider