Tại sao băm MD5 do Python tạo ra khác với băm được tạo bằng echo và md5sum trong shell?


109

Hàm băm MD5 trong Python khác với hàm băm được tạo bởi lệnh md5sum trên shell. Tại sao?

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


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

Câu trả lời:


198

echothêm vào một \nvì bạn thường không muốn các dòng không kết thúc bằng dấu ngắt dòng trong shell của bạn (nó trông thực sự xấu nếu lời nhắc không bắt đầu ở bên trái).
Sử dụng -nđối số để bỏ qua dấu ngắt dòng ở cuối và nó sẽ in tổng kiểm tra giống như tập lệnh python của bạn:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
Trên thực tế, đây là một trong những ví dụ lớn mà tôi sử dụng khi tôi bảo mọi người sử dụng nhiều ngôn ngữ Python hoặc ngôn ngữ cấp cao hơn thay vì các tập lệnh shell cho công việc thường được cho là thực hiện tốt hơn trong các tập lệnh shell. Bản chất của dữ liệu hỗn hợp và mã, và một cú pháp khác nhau cho mỗi lệnh tất cả các kịch bản shell làm vô hình lỗi dễ bị
jsbueno

7
Nếu chỉ thứ được đưa ra là "một cái vỏ" thì bạn không thể tin tưởng echođể có một -nlá cờ khả thi . POSIX nói như sau về echo: "Nếu toán hạng đầu tiên là -n, hoặc nếu bất kỳ toán hạng nào chứa một <backslash>ký tự, thì kết quả được xác định bởi việc triển khai." (nguồn: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ). Sử dụng printfthay thế.
Mikko Rantalainen 10/12/12

Vấn đề không phải do tiếng vọng, mà là ở md5sum (giờ là md5 trên Mac) và shasum đang thêm \ n vào cuối
Punnerud

@Punnerud: Không. Đầu ra của md5sumkhông quan trọng ở đây. Đầu vào không. Và nếu không -n, echo sẽ thêm vào một dấu ngắt dòng, dẫn đến một hàm băm khác.
ThiefMaster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.