Dlaczego skrót MD5 utworzony przez Pythona różni się od tego utworzonego za pomocą echo i sumy md5 w powłoce?

109

Skrót Pythona MD5 różni się od tego utworzonego przez polecenie md5sum w powłoce. Czemu?

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


$ echo mystringforhash | md5sum
686687dd68c5de717b34569dbfb8d3c3  - # Result on the shell
mailGO
źródło

Odpowiedzi:

198

echodołącza a, \nponieważ zwykle nie chcesz, aby w powłoce wiersze nie kończyły się znakiem podziału (wygląda to naprawdę brzydko, jeśli znak zachęty nie zaczyna się od lewej strony).
Użyj -nargumentu, aby pominąć końcowy podział wiersza, a wydrukuje tę samą sumę kontrolną, co twój skrypt w Pythonie:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
ThiefMaster
źródło
53
Właściwie jest to jeden z wielkich przykładów, których używam, kiedy mówię ludziom, aby używali większej liczby języków Pythona lub języków wyższego poziomu zamiast skryptów powłoki do pracy, która jest zwykle uważana za lepiej wykonaną w skryptach powłoki. Charakter mieszany danych i kodu, a inną składnią dla każdego polecenia wszystkie skrypty powłoki make niewidocznie podatne na błędy
jsbueno
7
Jeśli jedyną daną rzeczą jest „powłoka”, nie możesz ufać, echoże masz działającą -nflagę. POSIX mówi co następuje echo: "Jeśli pierwszy operand to -n, lub jeśli którykolwiek z operandów zawiera <backslash>znak, wyniki są zdefiniowane przez implementację." (źródło: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Użyj printfzamiast tego.
Mikko Rantalainen
Problem nie dotyczy echa, ale sumy md5 (teraz md5 na Macu) i shasum, czyli dodawanie \ n na koniec
Punnerud
@Punnerud: Nie. Wynik md5sumnie ma tutaj znaczenia. Wejście tak. Bez tego -necho dołącza znak podziału wiersza, co skutkuje innym hashem.
ThiefMaster