2011-04-17 24 views
97

Một băm MD5 Python là khác với một được tạo ra bởi lệnh md5sum trên vỏ. Tại sao?Tại sao một băm MD5 được tạo bởi Python khác với một băm được tạo ra bằng cách sử dụng echo và md5sum trong shell?

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


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

Trả lời

183

echo gắn thêm một \n vì bạn thường không muốn dòng không kết thúc bằng một linebreak trong shell của bạn (nó trông thật sự xấu xí nếu không kịp thời bắt đầu từ rất trái).
Sử dụng đối số -n để bỏ qua linebreak dấu và nó sẽ in checksum tương tự như kịch bản python của bạn:

> echo -n mystringforhash | md5sum 
86b6423cb6d211734fc7d81bbc5e11d3 - 
+50

Thực ra đây là một trong những ví dụ lớn tôi sử dụng khi tôi nói với mọi người sử dụng nhiều Python hoặc cấp kéo dây suôn sẻ các ngôn ngữ thay vì các kịch bản lệnh shell cho công việc thường được thực hiện tốt hơn trong các kịch bản 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ả làm cho kịch bản shell vô hình lỗi dễ bị – jsbueno

+6

Nếu chỉ có điều được cho là "một vỏ", bạn không thể tin tưởng 'echo' để có một' -n' cờ khả thi. POSIX nói 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 ký tự' ', kết quả sẽ được xác định thực hiện." (nguồn: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html). Sử dụng 'printf' để thay thế. –

Các vấn đề liên quan