Por que um hash MD5 criado pelo Python é diferente daquele criado com echo e md5sum no shell?

109

Um hash Python MD5 é diferente daquele criado pelo comando md5sum no 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
fonte

Respostas:

198

echoacrescenta um uma \nvez que você geralmente não quer que as linhas não terminem com uma quebra de linha em seu shell (parece muito feio se o prompt não começar à esquerda).
Use o -nargumento para omitir a quebra de linha final e ele imprimirá a mesma soma de verificação que seu script Python:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
ThiefMaster
fonte
53
Na verdade, este é um dos grandes exemplos que uso quando digo às pessoas para usarem mais Python ou linguagens de nível superior em vez de scripts de shell para o trabalho que normalmente é considerado melhor executado em scripts de shell. A natureza dos dados e códigos mistos e uma sintaxe diferente para cada comando tornam os scripts de shell invisivelmente sujeitos a erros
jsbueno
7
Se apenas o dado for "um shell", você não pode confiar echoque terá um -nsinalizador viável . POSIX diz o seguinte sobre echo: "Se o primeiro operando for -n, ou se algum dos operandos contiver um <backslash>caractere, os resultados serão definidos pela implementação." (fonte: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Use em seu printflugar.
Mikko Rantalainen
O problema não está em echo, mas em md5sum (agora md5 no Mac) e shasum que está adicionando \ n ao final
Punnerud de
@Punnerud: Não. A saída de md5sumnão importa aqui. A entrada sim. E sem -n, echo acrescenta uma quebra de linha, o que resulta em um hash diferente.
ThiefMaster de