it-swarm.com.de

Wie vergleicht man Teile von Dateien nach Hash?

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.

19
sinned

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 würden Sie über die Dateien gehen und sie direkt vergleichen.

Ein effizientes Dateivergleichstool ist cmp:

cmp --bytes $((100 * 1024 * 1024)) file1 file2 && echo "File fragments are identical"

Sie können es auch mit dd kombinieren, um beliebige Teile (nicht unbedingt von Anfang an) zweier Dateien zu vergleichen, z.

cmp \
    <(dd if=file1 bs=100M count=1 skip=1 2>/dev/null) \
    <(dd if=file2 bs=100M count=1 skip=1 2>/dev/null) \
&& echo "File fragments are identical"
56
Konrad Rudolph

Es tut mir leid, dass ich das nicht genau probieren kann, aber dieser Weg wird funktionieren

dd if=yourfile.Zip of=first100mb1.dat bs=100M count=1
dd if=yourotherfile.Zip of=first100mb2.dat bs=100M count=1

Dadurch erhalten Sie die ersten 100 Megabyte beider Dateien.

Holen Sie sich jetzt die Hashes:

sha256sum first100mb1.dat && sha256sum first100mb2.dat 

Sie können es auch direkt ausführen:

dd if=yourfile.Zip bs=100M count=1 | sha256sum 
dd if=yourotherfile.Zip bs=100M count=1 | sha256sum 
12
davidbaumann

Jeder scheint damit auf die Unix/Linux-Route zu gehen, aber mit Windows-Standardbefehlen kann man einfach 2 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 für eine einmalige Verwendung spielt das keine Rolle.

7
Tonny

Sie können die Dateien einfach direkt mit einem binären/hex diff-Programm wie vbindiff vergleichen. 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):

one                                       
0000 0000: 30 5C 72 A7 1B 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080: 
0000 0090: 
0000 00A0: 

two        
0000 0000: 30 5C 72 A7 1C 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....               
0000 0020: 
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:                                
0000 00A0:             
┌──────────────────────────────────────────────────────────────────────────────┐
│Arrow keys move  F find      RET next difference  ESC quit  T move top        │
│C ASCII/EBCDIC   E edit file   G goto position      Q quit  B move bottom     │
└──────────────────────────────────────────────────────────────────────────────┘ 
6
Xen2050

Ich weiß, es steht für Bash, 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 heruntergeladen werden von: der HxD-Website . Ich habe keine Verbindung zu den Autoren, ich benutze es nur seit Jahren.

0
Blerg

cmp teilt Ihnen mit, wann zwei Dateien bis zur Länge der kleineren Datei identisch sind:

$ dd if=/dev/random bs=8192 count=8192 > a
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.514571 secs (130417197 bytes/sec)
$ cp a b
$ dd if=/dev/random bs=8192 count=8192 >> b 
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.512228 secs (131013601 bytes/sec)
$ cmp a b
cmp: EOF on a

cmp gibt an, dass beim Vergleich ein EOF in Datei a festgestellt wurde, bevor ein Unterschied zwischen den beiden Dateien festgestellt wurde.

0
Jim L.