Значение хеша MD5 отличается от Bash и PHP [дубликат]


60

Я попытался сгенерировать сумму MD5 (используя md5sum) для строки "hello". Я опробовал различные методы в качестве инструмента md5sum в Linux, функцию PHP MD5 (), а также различные онлайн-переводчики текста в md5sum.

echo "hello" | md5sum

а также

echo "hello" > file && md5sum file

Дал результат b1946ac92492d2347c6235b4d2611184. Однако, PHP-функция md5 () и почти все онлайн-генераторы дали результат 5D41402ABC4B2A76B9719D911017C592.

Какова причина?


38
echo -n "hello"
Мартин Йорк,

Ответы:


80

По умолчанию echoвключает символ перевода строки в конце вывода. Тем не менее, PHP и веб-сайты, которые вы использовали, не включают перевод строки. Чтобы подавить символ новой строки, используйте -nфлаг:

echo -n "hello" | md5sum

Выход:

5d41402abc4b2a76b9719d911017c592 -

Видеть: help echo


или с помощью printf:

printf "%s" "hello" | md5sum

Я бы предложил показать более широко совместимую форму перед той, которая основана на поведении, не указанном в POSIX.
Чарльз Даффи

Спасибо. Я предпочитаю сначала показать проблему своим собственным примером и поведением эха.
Cyrus

7
Если вы не знаете операционную систему ОП, вы не знаете, что модифицированная версия «своего собственного примера» действительно будет работать. echo -nможет эхом, -nесли их Linux использует урезанный Busybox.
Чарльз Даффи

Я знаю операционную систему ОП.
Cyrus

Они указывают свое ядро, но где они говорят больше, чем это?
Чарльз Даффи

100

Ответ @ Сайруса точно соответствует тому, как решить эту проблему - чтобы объяснить, при использовании echoон выведет новую строку в конце строки. Как вы можете видеть на этом онлайн-выводе, helloс новой строкой выводится именно тот MD5, который вы получали ранее. Использование -nподавляет символ новой строки, а затем даст вам ожидаемый результат.

введите описание изображения здесь

Редактировать :

Вы можете видеть это ясно, если вы выводите его в hexdump, который показывает шестнадцатеричное число байтов там.

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

Смотрите 0a( \n) в конце строки

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

С -nэхо не ставит новую строку ( \n) в конце

Теперь с пустой строкой

$ echo  "" | hd
00000000  0a                                                |.|

Просто персонаж Новой Линии

$ echo -n  "" | hd

Пустая строка, поэтому hexdumpне выводится


2
Было бы интереснее пайп echo helloи echo -n helloк hexdump -Cсоответственно;)
Том Ян

19
Я рекомендую против echo -n, поскольку он нестандартный и несовместимо поддерживаемый (см. Единую спецификацию Unixecho и более подробный каталог несовместимостей Sven Mascheck ). Если вы хотите, чтобы он работал последовательно, используйте printfвместо этого; это немного сложнее в использовании (вы должны указать строку формата в дополнение к данным, которые вы хотите распечатать), но IMO стоит того, чтобы избежать проблем. В этом случае printf "%s" "hello"сделаем свое дело.
Гордон Дэвиссон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.