Ich habe eine erfolgreich heruntergeladene Datei und eine weitere fehlgeschlagene Datei (nur die ersten 100 MB einer großen Datei), von der ich vermute, dass es sich um dieselbe Datei handelt.
Um dies zu überprüfen, möchte ich ihre Hashes überprüfen, aber da ich nur einen Teil der nicht erfolgreich heruntergeladenen Datei habe, möchte ich nur die ersten paar Megabyte oder so hashen.
Wie mache ich das?
Betriebssystem wäre Windows, aber ich habe Cygwin und MinGW installiert.
Antworten:
Das Erstellen von Hashes zum Vergleichen von Dateien ist sinnvoll, wenn Sie eine Datei mit mehreren Dateien vergleichen oder wenn Sie mehrere Dateien miteinander vergleichen.
Es macht keinen Sinn, zwei Dateien nur einmal zu vergleichen: Der Aufwand, die Hashes zu berechnen, ist mindestens so hoch, als wenn Sie über die Dateien gehen und sie direkt vergleichen.
Ein effizientes Dateivergleichstool ist
cmp
:Sie können es auch kombinieren
dd
, um beliebige Teile (nicht unbedingt von Anfang an) zweier Dateien zu vergleichen, z.quelle
cmp
ist zu 99,99% sicher, dass es bereits installiert ist, wenn Siebash
ausgeführt werden, und es erledigt den Job. In der Tatcmp -n 131072 one.zip two.zip
wird das auch gelingen. Wenigste Zeichen und schnellste Ausführung. Das Berechnen eines Hashs ist unsinnig. Es erfordert das Lesen der gesamten 100-MB-Datei plus eines 100-MB-Teils der gesamten Datei, was sinnlos ist. Wenn es sich um Zip-Dateien handelt und diese unterschiedlich sind, gibt es innerhalb der ersten paar hundert Bytes einen Unterschied. Readahead liefert jedoch standardmäßig 128k, sodass Sie auch 128k vergleichen können (die gleichen Kosten wie beim Vergleichen von 1 Byte).--bytes
Option erschwert nur die Aufgabe. Führen Sie einfachcmp
ohne diese Option aus und es wird Ihnen das erste Byte angezeigt, das sich zwischen den Dateien unterscheidet. Wenn alle Bytes gleich sind, wird diesEOF
in der kürzeren Datei angezeigt. Dies gibt Ihnen mehr Informationen als in Ihrem Beispiel - wie viele Bytes sind korrekt.cmp
(und ich denke , so ziemlich jeder hat), können Sie--ignore-initial
und--bytes
Argumente statt Dinge mit Anrufungen zu verkomplizierendd
.Es tut mir leid, dass ich das nicht genau probieren kann, aber dieser Weg wird funktionieren
Dadurch erhalten Sie die ersten 100 Megabyte beider Dateien.
Holen Sie sich jetzt die Hashes:
Sie können es auch direkt ausführen:
quelle
cmp
).cmp
) ist ohne Zweifel ein Gewinner. Aber diese Art der Problemlösung (mit Hashes) hat auch das Recht zu existieren, solange sie das Problem tatsächlich löst (:Jeder scheint damit auf die Unix / Linux-Route zu gehen, aber mit Windows-Standardbefehlen kann man ganz einfach nur zwei Dateien vergleichen:
FC /B file file2
FC ist in jeder jemals erstellten Windows NT-Version vorhanden. Und (wenn ich mich richtig erinnere) war auch in DOS vorhanden.
Es ist ein bisschen langsam, aber das spielt für eine einmalige Verwendung keine Rolle.
quelle
Sie können die Dateien einfach direkt mit einem binären / hexadezimalen Diff-Programm vergleichen
vbindiff
. Es vergleicht schnell Dateien bis zu 4 GB unter Linux und Windows.Sieht ungefähr so aus, nur mit dem rot hervorgehobenen Unterschied (1B vs 1C):
quelle
vbindiff
(und Konradscmp
) vergleicht binäre Daten Byte für Byte. In der Tat hat Werte sind viel wahrscheinlicher KollisionenIch weiß, dass es für Bash steht, aber OP gibt auch an, dass sie Windows haben. Für alle, die eine Windows-Lösung benötigen, gibt es ein Programm namens HxD, einen Hex-Editor, mit dem zwei Dateien verglichen werden können. Wenn die Dateien unterschiedlich groß sind, wird angezeigt, ob die verfügbaren Teile identisch sind. Bei Bedarf können Prüfsummen für alle aktuell ausgewählten Elemente ausgeführt werden. Es ist kostenlos und kann von der HxD-Website heruntergeladen werden . Ich habe keine Verbindung zu den Autoren, ich benutze es nur seit Jahren.
quelle
cmp teilt Ihnen mit, wann zwei Dateien bis zur Länge der kleineren Datei identisch sind:
cmp gibt an, dass beim Vergleich eine EOF in Datei a festgestellt wurde, bevor ein Unterschied zwischen den beiden Dateien festgestellt wurde.
quelle