Почему хеш MD5, созданный Python, отличается от хеша, созданного с помощью echo и md5sum в оболочке?


109

Хеш Python MD5 отличается от хеша, созданного командой md5sum в оболочке. Зачем?

>>> import hashlib
>>> h = hashlib.md5()
>>> h.update("mystringforhash")
>>> print h.hexdigest()
86b6423cb6d211734fc7d81bbc5e11d3 # Result from Python


$ echo mystringforhash | md5sum
686687dd68c5de717b34569dbfb8d3c3  - # Result on the shell

Ответы:


198

echoдобавляет, \nтак как обычно вы не хотите, чтобы строки в вашей оболочке не заканчивались разрывом строки (это выглядит ужасно, если приглашение не начинается с самого левого края).
Используйте -nаргумент, чтобы опустить завершающий разрыв строки, и он напечатает ту же контрольную сумму, что и ваш скрипт python:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
На самом деле это один из ярких примеров, которые я использую, когда говорю людям использовать больше Python или языков более высокого уровня вместо сценариев оболочки для работы, которая обычно считается более эффективной в сценариях оболочки. Природа смешанных данных и кода, а также различный синтаксис для каждой команды - все это делает сценарии оболочки незаметно подверженными ошибкам
jsbueno

7
Если дана только «оболочка», которой нельзя доверять echo, имея работоспособный -nфлаг. В POSIX говорится следующее echo: «Если первый операнд -nили какой-либо из операндов содержит <backslash>символ, результаты определяются реализацией». (источник: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). printfВместо этого используйте .
Микко Ранталайнен

Проблема не в эхо, а в md5sum (теперь md5 на Mac) и shasum, который добавляет \ n в конец
Пуннеруд

@Punnerud: Нет. Результат md5sumздесь не имеет значения. Вход делает. И без него -necho добавляет перенос строки, что приводит к другому хешу.
ThiefMaster
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.