MD5 คือ 128 บิต แต่ทำไมถึงเป็น 32 ตัวอักษร?


95

ฉันอ่านเอกสารเกี่ยวกับ md5 มันบอกว่ามัน 128 บิต แต่ทำไมถึงเป็น 32 ตัวอักษร? ฉันคำนวณอักขระไม่ได้

  • 1 ไบต์คือ 8 บิต
  • ถ้า 1 อักขระคือ 1 ไบต์
  • แล้ว 128 บิตคือ 128/8 = 16 ไบต์ใช่ไหม

แก้ไข:

SHA-1 สร้าง 160 บิตมีอักขระกี่ตัว?


คุณสามารถโพสต์ลิงก์ไปยังเอกสารที่คุณอ้างอิงได้หรือไม่
Don Roby

@don: ขออภัยมันเป็นบันทึกย่อของวิทยากรของฉัน แต่ ba__friend ตอบคำถามของฉันแล้วและฉันทดสอบที่นี่: miraclesalad.com/webtools/md5.phpและอักขระเลขฐานสิบหกจริงๆเท่านั้นตอนนี้ฉันรู้สึกดีขึ้นมาก ฉันจะโหวตให้คำตอบของเขาเป็นคำตอบที่ดีที่สุด
hash_jr90


9
ไม่ใช่คำถามโง่ ๆ กาลครั้งหนึ่งคุณยังไม่รู้ว่าตัวอักษร HEX เป็นตัวแทนหนึ่งไบต์กี่ตัว
David Klempfner

ไพ ธ อนหนึ่งซับในการคำนวณความยาวบิตของแฮชคือ((1 << (n*4))-1).bit_length()โดยที่ n คือความยาวของแฮชเป็นเลขฐานสิบหก
Wouterr

คำตอบ:


107

32 ตัวอักษรเป็นตัวแทนฐานสิบหกนั่นคือ 2 ตัวอักษรต่อไบต์


1
1 ไบต์แสดงด้วยเลขฐานสิบหกสองหลักเช่น 255 = ff
ba__friend

1
ดังนั้น 1 ไบต์จึงเป็น 2 ตัวอักษรซึ่งหมายความว่า 16 บิตคือ 2 ตัวอักษรแล้ว 128/16 = 8 ดังนั้น 8 จาก 2 ตัวอักษร = 16 ตัวอักษรจึงเป็นสิ่งที่จำเป็น? ทำไมต้อง 32?
Koray Tugay

15
เนื่องจากอักขระเลขฐานสิบหกแต่ละตัวสามารถแสดงด้วย 4 บิต ดังนั้นถ้าเป็น 128 บิตจะเป็น 128/4 = 32 อักขระฐานสิบหก แม้ว่า "char" แต่ละตัวจะถูกเข้ารหัสเป็น utf8 หรือ ascii ซึ่งจะทำให้การแทนค่าฐานสิบหกมีขนาด 32 * 8 = 256 บิต
Gaston Sanchez

2
นี่เป็นคำตอบที่น่าสงสารจริงๆ คำตอบของฉันมีรายละเอียดเกี่ยวกับสิ่งนี้: stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay "ดังนั้น 1 ไบต์คือ 2 ตัวอักษรซึ่งหมายความว่า 16 บิตคือ 2 ตัวอักษร" - 1 ไบต์! = 16 บิต
David Klempfner

36

ฉันต้องการสรุปคำตอบบางส่วนในโพสต์เดียว

อันดับแรกอย่าคิดว่าแฮช MD5 เป็นสตริงอักขระ แต่เป็นเลขฐานสิบหก ดังนั้นแต่ละหลักจึงเป็นเลขฐานสิบหก (0-15 หรือ 0-F) และแทนสี่บิตไม่ใช่แปด

การที่ต่อหนึ่งไบต์หรือแปดบิตจะแทนด้วยตัวเลขสองหลักหกเหลี่ยมเช่น b' 1111 1111' = =0xFF255

แฮช MD5 มีความยาว 128 บิตและโดยทั่วไปแสดงด้วยเลขฐานสิบหก 32 หลัก

แฮช SHA-1 มีความยาว 160 บิตและโดยทั่วไปแสดงด้วยเลขฐานสิบหก 40 หลัก

สำหรับตระกูล SHA-2 ฉันคิดว่าความยาวแฮชอาจเป็นหนึ่งในชุดที่กำหนดไว้ล่วงหน้า ดังนั้น SHA-512 จึงสามารถแสดงด้วยเลขฐานสิบหก 128 หลัก

อีกครั้งโพสต์นี้อ้างอิงจากคำตอบก่อนหน้านี้


26

"อักขระ" ฐานสิบหก (แทะ) แตกต่างจาก "อักขระ"

เพื่อให้ชัดเจนเกี่ยวกับบิต vs ไบต์, vs อักขระ

  • 1 ไบต์คือ 8 บิต (สำหรับวัตถุประสงค์ของเรา)
  • 8 บิตให้2**8ชุดค่าผสมที่เป็นไปได้: ชุดค่าผสม 256 ชุด

เมื่อคุณดูอักขระเลขฐานสิบหก

  • 16 ชุดค่าผสม[0-9] + [a-f]: เต็มรูปแบบของ0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 น้อยกว่า 256 ดังนั้นอักขระเลขฐานสิบหกหนึ่งตัวจะไม่เก็บไบต์
  • 16 คือ2**4: นั่นหมายความว่าอักขระเลขฐานสิบหกหนึ่งตัวสามารถเก็บ 4 บิตในหนึ่งไบต์ (ครึ่งไบต์)
  • ดังนั้นอักขระเลขฐานสิบหกสองตัวสามารถจัดเก็บได้ 8 บิตการ2**8รวมกัน
  • ไบต์ที่แสดงเป็นอักขระ[0-9a-f][0-9a-f]เลขฐานสิบหกคือและแทนค่าครึ่งหนึ่งของไบต์ (เราเรียกว่าครึ่งไบต์ว่าแทะ )

เมื่อคุณดูอักขระไบต์เดี่ยวปกติ (เราจะข้ามอักขระหลายไบต์และอักขระแบบกว้างไปที่นี่โดยสิ้นเชิง)

  • สามารถจัดเก็บชุดค่าผสมได้มากกว่า 16 ชุด
  • ความสามารถของอักขระถูกกำหนดโดยการเข้ารหัส ตัวอย่างเช่นISO 8859-1 ที่เก็บทั้งไบต์เก็บข้อมูลทั้งหมดนี้
  • ทุกสิ่งที่จะใช้เวลาทั้ง2**8ช่วง
  • หากอักขระเลขฐานสิบหกใน an md5()สามารถจัดเก็บข้อมูลทั้งหมดได้คุณจะเห็นตัวอักษรตัวพิมพ์เล็กทั้งหมดตัวอักษรตัวพิมพ์ใหญ่เครื่องหมายวรรคตอนและสิ่งต่างๆเช่น¡°ÀÐàðช่องว่างเช่น (บรรทัดใหม่และแท็บ) และอักขระควบคุม (ซึ่งคุณสามารถ ' ไม่เห็นด้วยซ้ำและหลายรายการที่ไม่ได้ใช้งาน)

ดังนั้นมันจึงแตกต่างกันอย่างชัดเจนและฉันหวังว่าจะให้รายละเอียดของความแตกต่างที่ดีที่สุด


1
สิ่งนี้ "ลำดับใดขึ้นอยู่กับสเป็คหรือแพลตฟอร์มจริง" หมายความว่าอย่างไร ชอบที่จะเห็นสิ่งนี้อธิบายเพิ่มเติมอีกเล็กน้อย
KumarM

@KumarM ฉันจะลบมันออกเพราะฉันไม่คิดว่ามันเกี่ยวข้องกับการสนทนาเลยและมันก็ใช้คำไม่ดี
Evan Carroll

22

MD5 ให้เลขฐานสิบหก (0-15 / 0-F) ดังนั้นจึงเป็นสี่บิต 128/4 = 32 ตัวอักษร

SHA-1 จะให้เลขฐานสิบหกด้วย (0-15 / 0-F) ดังนั้น 160/4 = 40 อักขระ

(เนื่องจากเป็นการดำเนินการทางคณิตศาสตร์เอาต์พุตของฟังก์ชันการแฮชส่วนใหญ่มักแสดงเป็นเลขฐานสิบหก)

คุณอาจนึกถึงอักขระข้อความ ASCII ซึ่งมีขนาด 8 บิต


ขอบคุณจริงๆ .. ตอนนี้ฉันมีภาพที่ชัดเจนขึ้นมากแล้ว !!
hash_jr90

หมายเหตุ: ascii-charset มีสัญลักษณ์ที่ไม่สามารถพิมพ์ได้
Roy Lee

ฉันพยายามทำลายสิ่งนี้ให้ชัดเจนขึ้นเล็กน้อยstackoverflow.com/a/41618070/124486
Evan Carroll


2

ตัวเลขเหล่านี้เป็นเลขฐานสิบหกไม่ใช่อักขระ หนึ่งหลัก = 4 บิต



2

เลขฐานสิบหกหนึ่งตัว = 1 แทะ (สี่บิต)

เลขฐานสิบหกสองหลัก = 1 ไบต์ (แปดบิต)

MD5 = 32 ฐานสิบหก

เลขฐานสิบหก 32 หลัก = 16 ไบต์ (32/2)

16 ไบต์ = 128 บิต (16 * 8)

เช่นเดียวกับ SHA-1 ยกเว้นความยาวของเลขฐานสิบหก 40 หลัก

ฉันหวังว่านี่จะช่วยได้.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.