Mengapa hash MD5 yang dibuat oleh Python berbeda dari yang dibuat menggunakan echo dan md5sum di shell?

109

Hash Python MD5 berbeda dari yang dibuat oleh perintah md5sum pada shell. Mengapa?

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


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

Jawaban:

198

echomenambahkan a \nkarena Anda biasanya tidak menginginkan baris yang tidak diakhiri dengan pemutusan baris di shell (akan terlihat sangat jelek jika prompt tidak dimulai dari paling kiri).
Gunakan -nargumen untuk menghilangkan pemutusan baris terakhir dan itu akan mencetak checksum yang sama dengan skrip python Anda:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -
ThiefMaster
sumber
53
Sebenarnya ini adalah salah satu contoh besar yang saya gunakan ketika saya memberi tahu orang-orang untuk menggunakan lebih banyak bahasa tingkat Python atau lebih tinggi daripada skrip shell untuk pekerjaan yang biasanya dianggap lebih baik dilakukan dalam skrip shell. Sifat dari data dan kode campuran, dan sintaks yang berbeda untuk setiap perintah membuat skrip shell rentan terhadap kesalahan
jsbueno
7
Jika hanya yang diberikan adalah "shell", Anda tidak dapat mempercayai echomemiliki -nflag yang bisa diterapkan . POSIX mengatakan hal berikut tentang echo: "Jika operan pertama adalah -n, atau jika salah satu operand berisi <backslash>karakter, hasilnya ditentukan oleh implementasi." (sumber: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Gunakan printfsebagai gantinya.
Mikko Rantalainen
Masalahnya bukan pada gema, tetapi di md5sum (sekarang md5 di Mac) dan shasum yang menambahkan \ n sampai akhir
Punnerud
@Punnerud: Tidak. Keluaran md5sumtidak penting di sini. Masukan tidak. Dan tanpa -n, echo menambahkan pemutusan baris, yang menghasilkan hash yang berbeda.
ThiefMaster