เหตุใดแฮช MD5 ที่สร้างโดย Python จึงแตกต่างจากที่สร้างโดยใช้ echo และ md5sum ในเชลล์


109

แฮช Python MD5 แตกต่างจากแฮชที่สร้างโดยคำสั่ง md5sum บนเชลล์ ทำไม?

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


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

คำตอบ:


198

echoต่อท้าย\nเนื่องจากคุณมักไม่ต้องการให้บรรทัดที่ไม่ลงท้ายด้วย linebreak ในเชลล์ของคุณ (มันดูน่าเกลียดมากถ้าพรอมต์ไม่เริ่มต้นที่ด้านซ้ายสุด)
ใช้-nอาร์กิวเมนต์เพื่อละเว้น linebreak ต่อท้ายและจะพิมพ์การตรวจสอบเดียวกันกับสคริปต์ python ของคุณ:

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
อันที่จริงนี่เป็นหนึ่งในตัวอย่างใหญ่ ๆ ที่ฉันใช้เมื่อฉันบอกให้ผู้คนใช้ภาษา Python หรือภาษาระดับสูงแทนเชลล์สคริปต์สำหรับงานที่มักคิดว่าทำได้ดีกว่าในเชลล์สคริปต์ ลักษณะของข้อมูลและรหัสผสมและไวยากรณ์ที่แตกต่างกันสำหรับแต่ละคำสั่งล้วนทำให้เชลล์สคริปต์เกิดข้อผิดพลาดอย่างมองไม่เห็นได้ง่าย
jsbueno

7
หากสิ่งเดียวที่มอบให้คือ "เปลือก" คุณไม่สามารถไว้วางใจechoให้มี-nธงที่ใช้การได้ POSIX กล่าวต่อไปนี้เกี่ยวกับecho: "ถ้าตัวถูกดำเนินการตัวแรกเป็น-nหรือถ้าตัวถูกดำเนินการใด ๆ มี<backslash>อักขระผลลัพธ์จะถูกกำหนดให้ใช้งานได้" (ที่มา: pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html ) ใช้printfแทน
Mikko Rantalainen

ปัญหาไม่ได้อยู่ในเสียงสะท้อน แต่เป็น md5sum (ตอนนี้เป็น md5 บน Mac) และ shasum ที่เพิ่ม \ n ต่อท้าย
Punnerud

@Punnerud: ไม่ผลลัพธ์ของmd5sumไม่สำคัญที่นี่ อินพุตไม่ และหากไม่มี-nเสียงก้องจะต่อท้าย linebreak ซึ่งส่งผลให้เกิดแฮชที่แตกต่างกัน
ThiefMaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.