Значення хеша MD5 відрізняється від Bash та PHP [дублікат]


60

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

echo "hello" | md5sum

і

echo "hello" > file && md5sum file

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

В чому причина?


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

Відповіді:


80

За замовчуванням echoвключає символ нового рядка в кінці виводу. Однак PHP та веб-сайти, які ви використовували, не містять нову лінію. Щоб придушити символ нового рядка, використовуйте -nпрапор:

echo -n "hello" | md5sum

Вихід:

5d41402abc4b2a76b9719d911017c592 -

Побачити: help echo


або з printf:

printf "%s" "hello" | md5sum

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

Дякую. Я вважаю за краще показати проблему спочатку власним прикладом та поведінкою відлуння.
Кір

7
Якщо ви не знаєте операційну систему ОП, ви не знаєте, що модифікована версія "власного прикладу" насправді буде працювати. echo -nможе лунати, -nякщо їх Linux використовує збитий Busybox.
Чарльз Даффі

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

Вони вказують своє ядро, але де вони говорять більше?
Чарльз Даффі

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|

З -necho \nв кінці не ставиться новий рядок ( )

Тепер із порожнім рядком

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

Просто символ Нової лінії

$ echo -n  "" | hd

Порожній рядок, тому hexdumpне показує вихід


2
Було б цікавіше труби echo helloі echo -n helloдо hexdump -Cвідповідно;)
Том Ян

19
Я рекомендую проти echo -n, оскільки він нестандартний і непослідовно підтримується (див . Єдиний echoспектр Unix для та більш детальний каталог несумісностей Свена Машека ). Якщо ви хочете, щоб він працював послідовно, використовуйте printfнатомість; використовувати трохи складніше (ви повинні вказати рядок формату на додаток до даних, які ви хочете надрукувати), але IMO варто того, щоб уникнути проблем. У цьому випадку printf "%s" "hello"зробить трюк.
Гордон Девіссон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.