Значение хеша MD5 отличается от Bash и PHP
Я попытался сгенерировать сумму MD5 (используя md5sum) для строки "hello". Я опробовал различные методы в качестве инструмента md5sum в Linux, функцию PHP MD5(), а также различные онлайн-переводчики текста в md5sum.
echo "hello" | md5sum
а также
echo "hello" > file && md5sum file
Дал результат b1946ac92492d2347c6235b4d2611184, Тем не менее, функция PHP md5() и почти все онлайн-генераторы дали вывод 5D41402ABC4B2A76B9719D911017C592,
Какова причина?
2 ответа
По умолчанию, echo включает символ новой строки в конце вывода. Тем не менее, PHP и веб-сайты, которые вы использовали, не включают перевод строки. Чтобы подавить символ новой строки, используйте -n флаг:
echo -n "hello" | md5sum
Выход:
5d41402abc4b2a76b9719d911017c592 -
Увидеть: help echo
или с помощью printf:
printf "%s" "hello" | md5sum
Ответ @ Сайруса точно соответствует тому, как решить эту проблему - объяснить при использовании 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 не показывает вывод
