Чому хеш 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

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