2012-06-06 68 views
30

考慮以下幾點:爲什麼貌似空的文件和字符串會產生md5sums?

% 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 

首先,我對所有這些命令的輸出驚訝。如果有的話,我會期望它們的總和是相同的。

回答

64

「nothing」(零長度字符流)的md5sum是d41d8cd98f00b204e9800998ecf8427e,您在前兩個示例中可以看到它。

第三個和第四個示例正在處理單個字符。在「回聲」的情況下,這是一個換行符,即

$ echo -ne '\n' | md5sum 
68b329da9893e34099c7d8ad5cb9c940 - 

在perl的例子,它是用值爲0x00的單個字節,即

$ echo -ne '\x00' | md5sum 
93b885adfe0da089cdf634904fd59f71 - 

您可以使用「回聲」重現空校驗如下:

$ echo -n '' | md5sum 
d41d8cd98f00b204e9800998ecf8427e - 

...並使用Perl如下:

$ perl -e 'print ""' | md5sum 
d41d8cd98f00b204e9800998ecf8427e - 

在所有四種情況下,您應該期望校驗相同的數據具有相同的輸出,但不同的數據應該產生大不相同的校驗和(這就是整點 - 即使它只是單個字符不同)。

+1

...或'perl -e''' – minmaxavg

2

不需要驚喜。前兩個爲md5sum生成真實的空輸入。回聲產生一個換行符(echo -n ''應該產生一個空輸出;我沒有一臺linux機器在這裏檢查)。 perl產生一個零字節(不要與C中的零字節標記字符串尾)混淆。最後一條命令是查找一個空字符串作爲文件名的文件。

6

爲什麼看似空的文件和字符串會產生md5sums?

因爲 「總和」 在的md5sum是有點誤導。它不像例如CRC32校驗和,即空文件爲零。

MD5是消息摘要算法之一。您可以將其想象爲一個根據其內部狀態產生固定長度隨機查看值(散列)的框。通過輸入數據來改變內部狀態。

而且箱體內部狀態是預定義的,因此即使在輸入任何數據之前,它也會產生隨機查看的散列值。對於MD5,它恰好是d41d8cd98f00b204e9800998ecf8427e

+0

爲了更確切:MD5會在內部添加一個填充塊到消息的末尾。因此,散列值是在該填充塊上計算散列函數的結果,而不是精確的初始狀態。 – nneonneo

相關問題