1. ホーム
  2. string

[解決済み] 一見、空のファイルや文字列がmd5sumを生成するのはなぜですか?

2022-02-27 06:48:16

質問

次のように考えてください。

% 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"(長さ0の文字列)のmd5sumはd41d8cd98f00b204e9800998ecf8427eとなります。

3番目と4番目の例は、1文字を処理しています。echo"の場合は、改行、つまり、quot;echo"の場合は、改行です。

$ 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文字だけの違いであっても)。