¿Por qué un hash MD5 creado por Python es diferente de uno creado usando echo y md5sum en el shell?

109

Un hash Python MD5 es diferente al creado por el comando md5sum en el shell. ¿Por qué?

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


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

Respuestas:

198

echoagrega un \nya que generalmente no desea que las líneas no terminen con un salto de línea en su shell (se ve realmente feo si el indicador no comienza en el extremo izquierdo).
Use el -nargumento para omitir el salto de línea final e imprimirá la misma suma de verificación que su secuencia de comandos de Python:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
ThiefMaster
fuente
53
En realidad, este es uno de los grandes ejemplos que uso cuando le digo a la gente que use más Python o lenguajes de nivel superior en lugar de scripts de shell para el trabajo que normalmente se piensa que se hace mejor en los scripts de shell. La naturaleza de los datos y el código de mezclado, y una sintaxis diferente para cada comando de todos los scripts de shell maquillaje error invisiblemente propensos
jsbueno
7
Si lo único que se da es "un caparazón" en el que no puede confiar echopara tener una -nbandera que funcione . POSIX dice lo siguiente sobre echo: "Si el primer operando es -n, o si alguno de los operandos contiene un <backslash>carácter, los resultados están definidos por la implementación". (fuente: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Úselo en su printflugar.
Mikko Rantalainen
El problema no está en echo, sino en md5sum (ahora md5 en Mac) y shasum que está agregando \ n al final
Punnerud
@Punnerud: No. La salida de md5sumno importa aquí. La entrada lo hace. Y sin -n, echo agrega un salto de línea, lo que da como resultado un hash diferente.
ThiefMaster