Das hängt von den Dateien ab, die Sie vergleichen wollen.
A) Das Worst-Case-Szenario ist:
- Sie haben viele Dateien, die die gleiche Größe haben
- Die Dateien sind sehr groß
- Die Dateien sind sich sehr ähnlich und unterscheiden sich nur an einer kleinen zufälligen Stelle in der Datei
Zum Beispiel, wenn Sie hatten:
- 100x 2 MB große Dateien der gleichen Größe,
- Vergleich zueinander,
- mit Binärvergleich mit
- 50% Lesen der Datei (Wahrscheinlichkeit, ungleiche Bytes in der ersten Hälfte der Datei zu finden)
Dann hättest du das:
- 10.000 Vergleiche von
- 1MB, was gleichbedeutend ist mit
- insgesamt 10 GB zu lesen.
Wenn Sie jedoch das gleiche Szenario hätten, aber zunächst die Hashes der Dateien abgeleitet würden Sie:
- Lesen von 200 MB Daten von der Festplatte (in der Regel die langsamste Komponente in einem Computer) und Destillieren auf
- 1,6K im Speicher (mit MD5-Hashing - 16 Byte - Sicherheit ist nicht wichtig)
- und würde 2N*2MB für den endgültigen direkten Binärvergleich lesen, wobei N die Anzahl der gefundenen Duplikate ist.
Ich denke, dieses Worst-Case-Szenario ist nicht typisch Allerdings.
B) Das typische Szenario ist:
- Die Dateien sind in der Regel unterschiedlich groß
- Die Dateien unterscheiden sich höchstwahrscheinlich am Anfang der Datei - Das bedeutet, dass bei einem direkten Binärvergleich in der Regel nicht die gesamte Datei gelesen werden muss, wenn es sich um eine Vielzahl unterschiedlicher Dateien gleicher Größe handelt.
Zum Beispiel, wenn Sie hatten:
- Ein Ordner mit MP3-Dateien (sie sollten nicht zu groß werden - vielleicht nicht größer als 5 MB)
- 100 Dateien
- Größe zuerst prüfen
- höchstens 3 Dateien gleicher Größe (Duplikate oder nicht)
- mit Binärvergleich für Dateien der gleichen Größe
- 99 % der Wahrscheinlichkeit, dass sie nach 1 KBytes anders sind
Dann hättest du das:
- Höchstens 33 Fälle, in denen die Länge in 3 Dateisätzen gleich ist
- Paralleles binäres Lesen von 3 Dateien (oder mehr ist möglich) gleichzeitig in 4K-Blöcken
- Bei 0 % gefundenen Duplikaten - 33 * 3 * 4K der gelesenen Dateien = 396KB Festplattenlesung
- Mit 100% multipliziert gefunden = 33 * 3 * N, wobei N die Dateigröße ist (~5MB) = ~495MB
Wenn Sie 100%ige Multiplikationen erwarten, ist Hashing nicht effizienter als ein direkter Binärvergleich. Wenn Sie <100% Multiplikationen erwarten, wäre Hashing weniger effizient als ein direkter Binärvergleich.
C) Wiederholter Vergleich
Dies ist die Ausnahme. Der Aufbau einer Hash+Länge+Pfad-Datenbank für alle Dateien wird wiederholte Vergleiche beschleunigen. Aber die Vorteile wären marginal. Anfangs müssen die Dateien zu 100 % gelesen und die Hash-Datenbank gespeichert werden. Die neue Datei muss zu 100 % gelesen und dann zur Datenbank hinzugefügt werden, und wenn sie übereinstimmt, ist immer noch ein direkter Binärvergleich als letzter Vergleichsschritt erforderlich (um Hash-Kollisionen auszuschließen). Selbst wenn die meisten Dateien unterschiedlich groß sind, kann eine neue Datei, die im Zielordner erstellt wird, mit einer bereits vorhandenen Datei übereinstimmen und so schnell vom direkten Vergleich ausgeschlossen werden.
Zum Schluss:
- Es sollten keine zusätzlichen Hashes verwendet werden (der ultimative Test - Binärvergleich - sollte immer der letzte Test sein)
- Der Binärvergleich ist beim ersten Durchlauf oft effizienter, wenn es viele Dateien unterschiedlicher Größe gibt.
- Der MP3-Vergleich funktioniert gut mit Längen- und nicht mit Binärvergleichen.