以下を検討してください。
% md5sum /dev/null
d41d8cd98f00b204e9800998ecf8427e /dev/null
% touch empty; md5sum empty
d41d8cd98f00b204e9800998ecf8427e empty
% echo '' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -
% Perl -e 'print chr(0)' | md5sum
93b885adfe0da089cdf634904fd59f71 -
% md5sum ''
md5sum: : No such file or directory
まず、これらすべてのコマンドの出力に驚いています。どちらかと言えば、それらすべての合計が同じになると思います。
"nothing"(長さがゼロの文字ストリーム)のmd5sumはd41d8cd98f00b204e9800998ecf8427eで、最初の2つの例に表示されています。
3番目と4番目の例は、単一の文字を処理しています。 「エコー」の場合、それは改行です。
$ echo -ne '\n' | md5sum
68b329da9893e34099c7d8ad5cb9c940 -
Perlの例では、値0x00の1バイトです。
$ echo -ne '\x00' | md5sum
93b885adfe0da089cdf634904fd59f71 -
次のように、「echo」を使用して空のチェックサムを再現できます。
$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
...そして次のようにPerlを使用します:
$ Perl -e 'print ""' | md5sum
d41d8cd98f00b204e9800998ecf8427e -
4つのケースすべてで、同じデータのチェックサムから同じ出力を期待する必要がありますが、異なるデータは大幅に異なるチェックサムを生成する必要があります(それが全体のポイントです-それが異なるのは1文字だけでも)。
一見空のファイルと文字列がmd5sumsを生成するのはなぜですか?
md5sumの "sum"は誤解を招くためです。それは例えばのようなものではありません。 CRC32チェックサム。空のファイルの場合はゼロです。
MD5はメッセージダイジェストアルゴリズムの1つです。これは、内部状態に応じて固定長のランダムな値(ハッシュ)を生成するボックスと考えることができます。データを入力して内部状態を変更します。
そして、そのボックスの内部状態は事前に定義されているため、データが入力される前でもランダムに見えるハッシュ値が生成されます。MD5の場合、d41d8cd98f00b204e9800998ecf8427e
。
驚きの必要はありません。最初の2つは、md5sumへの真の空の入力を生成します。エコーは改行(echo -n ''
は空の出力を生成するはずです。ここに確認するLinuxマシンはありません)。 Perlは単一のゼロバイトを生成します(ゼロバイトが文字列の終わりを示すCと混同しないでください)。最後のコマンドは、空の文字列をファイル名として含むファイルを探しています。