Значение хеша 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не выводится

Jonno
источник
2
Было бы интереснее пайп echo helloи echo -n helloк hexdump -Cсоответственно;)
Том Ян
19
Я рекомендую против echo -n, поскольку он нестандартный и несовместимо поддерживаемый (см. Единую спецификацию Unixecho и более подробный каталог несовместимостей Sven Mascheck ). Если вы хотите, чтобы он работал последовательно, используйте printfвместо этого; это немного сложнее в использовании (вы должны указать строку формата в дополнение к данным, которые вы хотите распечатать), но IMO стоит того, чтобы избежать проблем. В этом случае printf "%s" "hello"сделаем свое дело.
Гордон Дэвиссон