web-dev-qa-db-ja.com

ファイルの一部をハッシュで比較する方法

1つのファイルが正常にダウンロードされ、もう1つがダウンロードに失敗しました(大きなファイルの最初の100 MBのみ)が、同じファイルであると思われます。

これを確認するために、私は彼らのハッシュをチェックしたいのですが、私は失敗したダウンロードファイルの一部しか持っていないので、私は最初の数メガバイト程度をハッシュしたいだけです。

どうやってこれをするの?

OSはwindowsですが、cygwinとMinGWがインストールされています。

19
sinned

ファイルを比較するためのハッシュの作成は、1つのファイルを多数のファイルと比較する場合、または多数のファイルを互いに比較する場合には意味があります。

2つのファイルを1回だけ比較する場合は意味がありません。ハッシュを計算する作業は、少なくともファイルを調べて直接比較するのと同じぐらい高いです。

効率的なファイル比較ツールはcmpです。

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

2つのファイルの任意の部分(必ずしも最初からではない)を比較するためにそれをddと組み合わせることもできます。例えば:

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

申し訳ありませんが、それを試すことはできませんが、この方法でうまくいくでしょう

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

これにより、両方のファイルの最初の100メガバイトが得られます。

今ハッシュを取得します。

sha256sum first100mb1.dat && sha256sum first100mb2.dat 

直接実行することもできます。

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

誰もがこれでUnix/Linuxの道を進んでいるようですが、2つのファイルを比較することはWindowsの標準的なコマンドで簡単に実行できます。
FC /B file file2

FCは、これまでに作成されたすべてのWindows NTバージョンに存在します。そして(私が正しく思い出した場合)DOSにも存在していました。
それは少し遅いです、しかしそれは一度だけの使用には関係ありません。

7
Tonny

vbindiff のようなバイナリ/ 16進数差分プログラムを使用して、ファイルを直接比較することもできます。それはすぐにLinuxとWindows上で4GBまでのファイルを比較します。

違いは赤で強調表示されているだけです(1Bと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

私はそれがBashのために言うことを知っています、しかしOPはまた彼らがWindowsを持っていると述べています。 Windowsソリューションを望んでいる、または必要としている人のために、2つのファイルを比較できる16進エディタであるHxDと呼ばれるプログラムがあります。ファイルのサイズが異なる場合は、利用可能な部分が同じかどうかがわかります。そして必要に応じて、現在選択されているものすべてに対してチェックサムを実行することができます。それは無料で、以下からダウンロードすることができます。 HxDウェブサイト 。私は作者との関係はありません。私は何年もそれを使っています。

0
Blerg

2つのファイルが小さい方のファイルの長さまで同一である場合、cmpはそれを教えてくれます。

$ 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は、2つのファイル間の相違を検出する前に、比較がファイルaでEOFを検出したことを通知しています。

0
Jim L.