Warum unterscheidet sich ein von Python erstellter MD5-Hash von einem mit echo und md5sum in der Shell erstellten?

109

Ein Python MD5-Hash unterscheidet sich von dem, der mit dem Befehl md5sum in der Shell erstellt wurde. Warum?

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


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

Antworten:

198

echofügt a hinzu, \nda Sie normalerweise nicht möchten, dass Zeilen nicht mit einem Zeilenumbruch in Ihrer Shell enden (es sieht wirklich hässlich aus, wenn die Eingabeaufforderung nicht ganz links beginnt).
Verwenden Sie das -nArgument, um den nachgestellten Zeilenumbruch wegzulassen, und es wird dieselbe Prüfsumme wie in Ihrem Python-Skript ausgegeben:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
DiebMaster
quelle
53
Tatsächlich ist dies eines der großen Beispiele, die ich verwende, wenn ich den Leuten sage, dass sie mehr Python- oder höhere Sprachen anstelle von Shell-Skripten für Arbeiten verwenden sollen, die normalerweise in Shell-Skripten besser ausgeführt werden. Die Art der gemischten Daten und des gemischten Codes sowie eine andere Syntax für jeden Befehl machen Shell-Skripte unsichtbar fehleranfällig
jsbueno
7
Wenn nur "eine Shell" angegeben ist, können Sie nicht darauf vertrauen echo, dass ein funktionsfähiges -nFlag vorhanden ist. POSIX sagt Folgendes über echo: "Wenn der erste Operand ist -noder wenn einer der Operanden ein <backslash>Zeichen enthält, sind die Ergebnisse implementierungsdefiniert." (Quelle: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Verwenden Sie printfstattdessen.
Mikko Rantalainen
Das Problem liegt nicht im Echo, sondern in md5sum (jetzt md5 auf Mac) und shasum, das am Ende \ n hinzufügt
Punnerud,
@ Punnerud: Nein. Die Ausgabe von md5sumspielt hier keine Rolle. Die Eingabe tut. Und ohne -nfügt echo einen Zeilenumbruch hinzu, der zu einem anderen Hash führt.
ThiefMaster