Перейти к содержимому

Значение хеша MD5 отличается от Bash и PHP

59

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

echo "hello" | md5sum 

а также

echo "hello" > file && md5sum file 

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

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

38 464 просмотра
Himanshu Shekhar спросил 10 лет назад
H 435

2 ответа

101

Ответ @ Сайруса точно соответствует тому, как решить эту проблему - чтобы объяснить, при использовании 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не выводится

Было бы более интересно передать echo hello и echo -n hello в hexdump -C соответственно;)

Tom Yan · 10 лет назад · 2

Я рекомендую не использовать echo -n, поскольку он нестандартный и несовместимо поддерживаемый (см. Спецификация Single Unix для echo и более подробный каталог несовместимостей Свена Машика). Если вы хотите, чтобы он работал последовательно, используйте вместо него printf; это немного сложнее в использовании (вы должны указать строку формата в дополнение к данным, которые вы хотите распечатать), но IMO стоит того, чтобы избежать проблем. В этом случае printf"% s "" hello " добьется цели.

Gordon Davisson · 10 лет назад · 19
Jonno ответил 10 лет назад
J 17 476
78
Принятый ответ

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

echo -n "hello" | md5sum 

Выход:

5d41402abc4b2a76b9719d911017c592 - 

Увидеть: help echo


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

printf "%s" "hello" | md5sum 

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

Charles Duffy · 10 лет назад · 0

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

Cyrus · 10 лет назад · 0

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

Charles Duffy · 10 лет назад · 7

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

Cyrus · 10 лет назад · 0

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

Charles Duffy · 10 лет назад · 0

@CharlesDuffy: Хороший улов.

Cyrus · 10 лет назад · 0

как насчет дополнительного `` `-``` в конце?

lrkwz · 9 лет назад · 0

@lrkwz: Я предполагаю, что это означает, что данные пришли из stdin, а не из файла.

Cyrus · 9 лет назад · 0
Cyrus ответил 10 лет назад
C 3 741