52

次のことを考慮してください。

% 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

まず第一に、私はこれらすべてのコマンドの出力に驚いています。どちらかといえば、合計はそれらすべてで同じであると私は期待します。

4

3 に答える 3

100

「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文字だけです)。

于 2012-06-06T07:39:45.787 に答える
17

一見空のファイルと文字列がmd5sumを生成するのはなぜですか?

md5sumの「sum」はやや誤解を招くためです。たとえば、CRC32チェックサムとは異なり、空のファイルの場合はゼロです。

MD5は、メッセージダイジェストアルゴリズムの1つです。内部状態に応じて固定長のランダムに見える値(ハッシュ)を生成するボックスとして想像できます。データを入力して内部状態を変更します。

また、そのボックスの内部状態は事前定義されているため、データが入力される前でもランダムに見えるハッシュ値が生成されます。MD5の場合は、たまたまd41d8cd98f00b204e9800998ecf8427eです。

于 2014-12-15T21:51:55.387 に答える
3

驚きの必要はありません。最初の2つは、md5sumへの真の空の入力を生成します。エコーは改行を生成します(echo -n ''空の出力を生成するはずです。ここにチェックするLinuxマシンがありません)。perlは単一のゼロバイトを生成します(ゼロバイトが文字列の終わりを示すCと混同しないでください)。最後のコマンドは、ファイル名として空の文字列を持つファイルを探しています。

于 2012-06-06T07:46:16.720 に答える