Es würde von den Dateien abhängen, die Sie vergleichen.
A) Das schlimmste Szenario ist:
- Sie haben viele Dateien, die die gleiche Größe haben
- Die Dateien sind sehr groß
- Die Dateien sind sehr ähnlich, mit Unterschieden, die an einer engen zufälligen Stelle in der Datei gefunden werden
Zum Beispiel, wenn Sie hätten:
- 100x 2MB Dateien derselben Größe,
- Vergleich miteinander,
- mit binärem Vergleich unter Verwendung von
- 50% Dateilesen (Wahrscheinlichkeit, ein ungleiches Byte in der ersten Hälfte der Datei zu finden)
Dann hätten Sie:
- 10.000 Vergleiche von
- 1MB, was gleichbedeutend ist mit
- insgesamt 10GB zu lesenden Daten.
Wenn Sie jedoch dasselbe Szenario haben, aber die Hashes der Dateien zuerst ableiten, würden Sie:
- 200MB Daten von der Festplatte lesen (typischerweise das langsamste Komponente in einem Computer), die sich destillieren zu
- 1,6K im Speicher (unter Verwendung von MD5-Hashing - 16 Byte - Sicherheit ist nicht wichtig)
- und würden 2N*2MB für den endgültigen direkten binären Vergleich lesen, wobei N die Anzahl der gefundenen Duplikate ist.
Ich denke, dieses schlimmste Szenario ist nicht typisch jedoch.
B) Das typische Szenario ist:
- Dateien haben normalerweise verschiedene Größen
- Die Dateien unterscheiden sich höchstwahrscheinlich nahe dem Anfang der Datei - dies bedeutet, dass beim direkten binären Vergleich in der Regel nicht die gesamte Datei bei den meisten sich unterscheidenden Dateien derselben Größe gelesen wird.
Zum Beispiel, wenn Sie hätten:
- Einen Ordner mit MP3-Dateien (sie werden nicht zu groß - vielleicht nicht größer als 5MB)
- 100 Dateien
- zuerst die Größe überprüfen
- höchstens 3 Dateien derselben Größe (Duplikate oder nicht)
- binärer Vergleich für Dateien derselben Größe verwenden
- zu 99% wahrscheinlich, dass sie sich nach 1KByte unterscheiden
Dann hätten Sie:
- Höchstens 33 Fälle, in denen die Länge in 3 Dateisätzen gleich ist
- Parallelles binäres Lesen von 3 Dateien (oder mehr ist möglich) gleichzeitig in 4K-Blöcken
- Bei 0% gefundenen Duplikaten - 33 * 3 * 4K von Lesedateien = 396KB an Festplattenlesevorgängen
- Bei 100% gefundenen Duplikaten = 33 * 3 * N, wobei N die Dateigröße ist (~5MB) = ~495MB
Wenn Sie 100% Duplikate erwarten, wäre das Hashing nicht effizienter als der direkte binäre Vergleich. Da Sie jedoch <100% Duplikate erwarten sollten, wäre das Hashing weniger effizient als der direkte binäre Vergleich.
C) Wiederholter Vergleich
Dies ist die Ausnahme. Der Aufbau einer Hash+Längen+Pfad-Datenbank für alle Dateien beschleunigt wiederholte Vergleiche. Aber die Vorteile wären marginal. Es würde anfänglich 100% Lesen der Dateien erfordern und die Speicherung der Hash-Datenbank. Die neue Datei müsste zuerst zu 100% gelesen und zur Datenbank hinzugefügt werden, und wenn sie übereinstimmt, wäre immer noch der direkte binäre Vergleich als abschließender Vergleichsschritt erforderlich (um Kollisionen bei den Hashes auszuschließen). Selbst wenn die meisten Dateien unterschiedliche Größen haben, kann bei Erstellung einer neuen Datei im Zielordner diese möglicherweise die Größe einer vorhandenen Datei haben und schnell vom direkten Vergleich ausgeschlossen werden.
Zusammenfassend:
- Es sollten keine zusätzlichen Hashes verwendet werden (der ultimative Test - binärer Vergleich - sollte immer der letzte Test sein)
- Der binäre Vergleich ist oft effizienter beim ersten Durchlauf, wenn es viele Dateien mit unterschiedlichen Größen gibt
- MP3-Vergleiche funktionieren gut mit Längen- und dann binärem Vergleich.
1 Stimmen
Die Wahrscheinlichkeit einer Hash-Kollision ist äußerst gering. Wenn Sie 100%ige Sicherheit darüber hinaus wünschen, können Sie einfach die vollständigen Dateiinhalte vergleichen - die Leistung ist selten so wichtig.
1 Stimmen
@delnan: Das ist nicht korrekt. Die Wahrscheinlichkeit einer Kollision für eine bestimmte Datei ist gering, für große Dateisammlungen ist sie jedoch viel höher - siehe das Geburtstagsparadoxon als Beispiel. Die Wahrscheinlichkeit, dass zwei Personen von insgesamt 23 am selben Tag Geburtstag haben, beträgt 50%. Die Wahrscheinlichkeit einer Kollision nimmt exponentiell zu, je größer die Sammlung wird.
1 Stimmen
@amit Ich kenne das Geburtstagsparadoxon, deshalb sage ich nicht "die Chancen sind so gering, dass es nicht notwendig ist, zu überprüfen". Auch mein Bauchgefühl sagt mir, dass die Chancen für zwei Dateien so gering sind, dass es hunderte oder tausende von Dateien brauchen würde, um Kollisionschancen >1 zu haben. Aber ja, ich sollte das lieber zuerst überprüfen. Die Tabelle in diesem Artikel (bezüglich Geburtstagsangriff) scheint das zu bestätigen. Wenn ich das richtig lese, erfordert ein perfekter 64-Bit-Hash
1,9 × 10^8
(= 190 Millionen) Dateien selbst für eine Kollisionschance von 0,1%.