Подтвердить что ты не робот

Почему кажущиеся пустые файлы и строки производят 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

Прежде всего, меня удивляет выход всех этих команд. Во всяком случае, я ожидал бы, что сумма будет одинаковой для всех из них.

4b9b3361

Ответ 1

md5sum "ничего" (поток символов с нулевой длиной) - это d41d8cd98f00b204e9800998ecf8427e, который вы видите в первых двух примерах.

Третий и четвертый примеры обрабатывают один символ. В случае "эха" это новая строка, т.е.

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

В примере perl он представляет собой один байт со значением 0x00, то есть

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

Вы можете воспроизвести пустую контрольную сумму с помощью "эха" следующим образом:

$ echo -n '' | md5sum
d41d8cd98f00b204e9800998ecf8427e -

... и используя Perl следующим образом:

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

Во всех четырех случаях вы должны ожидать, что один и тот же вывод будет проверяться на одних и тех же данных, но разные данные должны давать совершенно разную контрольную сумму (что весь смысл - даже если это только один символ, который отличается.)

Ответ 2

Почему кажущиеся пустые файлы и строки производят md5sums?

Потому что "сумма" в md5sum несколько вводит в заблуждение. Это не так. Контрольная сумма CRC32, равная нулю для пустого файла.

MD5 является одним из алгоритмов дайджеста сообщений. Вы можете представить это как ящик, который создает случайное значение фиксированной длины (хеш) в зависимости от его внутреннего состояния. Вы изменяете внутреннее состояние, подавая данные.

И это внутреннее состояние этого окна предопределено, так что оно дает беспорядочно выглядящее хеш-значение даже до того, как будут поданы какие-либо данные. Для MD5 это бывает d41d8cd98f00b204e9800998ecf8427e.

Ответ 3

Не нужно удивляться. Первые два порождают истинные пустые входы в md5sum. Echo создает новую строку (echo -n '' должен выводить пустой вывод, у меня нет машины Linux для проверки). Perl создает одиночный нулевой байт (не путать с C, где нулевой байт заканчивает строку). Последняя команда ищет файл с пустой строкой в ​​качестве имени файла.