MD5 là 128 bit nhưng tại sao lại là 32 ký tự?


95

Tôi đọc một số tài liệu về md5, nó nói rằng 128 bit của nó, nhưng tại sao nó là 32 ký tự? Tôi không thể tính toán các ký tự.

  • 1 byte là 8 bit
  • nếu 1 ký tự là 1 byte
  • thì 128 bit là 128/8 = 16 byte phải không?

BIÊN TẬP:

SHA-1 tạo ra 160 bit, vậy có bao nhiêu ký tự?


Bạn có thể đăng liên kết đến tài liệu mà bạn tham khảo không?
Don Roby

@don: Xin lỗi, đó là ghi chú của giảng viên của tôi. Nhưng ba__friend đã trả lời câu hỏi của tôi, và tôi kiểm tra nó ở đây: miraclesalad.com/webtools/md5.php , và các nhân vật thực sự thập lục phân của nó mà thôi, nó có ý nghĩa nhiều hơn nữa đối với tôi bây giờ. Tôi sẽ bỏ phiếu câu trả lời của mình như là câu trả lời tốt nhất
hash_jr90

Tôi nghĩ câu trả lời của tôi đi sâu vào vấn đề này hơn bất kỳ câu trả lời nào khác. Nếu bạn là người mới đến lập trình máy tính và hỏi câu hỏi này và muốn có một câu trả lời qua
Evan Carroll

9
Đó không phải là một câu hỏi ngớ ngẩn. Đã có lúc bạn cũng không biết có bao nhiêu ký tự HEX đại diện cho một byte.
David Klempfner

Một con trăn nhanh chóng một lớp lót để tính toán độ dài bit của một hàm băm ((1 << (n*4))-1).bit_length()trong đó n là độ dài của hàm băm trong hệ thập lục phân
Wouterr Ngày

Câu trả lời:


107

32 ký tự dưới dạng biểu diễn thập lục phân, tức là 2 ký tự mỗi byte.


1
1 byte được biểu thị bằng số thập lục phân có hai chữ số, như 255 = ff.
ba__friend

1
do đó 1 byte là 2 ký tự có nghĩa là 16 bit là 2 ký tự thì 128/16 = 8. Vậy 8 trong 2 ký tự = 16 ký tự là cần thiết khi đó? Tại sao lại 32?
Koray Tugay

15
Vì mỗi ký tự hex có thể được biểu diễn bằng 4 bit. Vì vậy, nếu nó là 128 bit thì nó là 128/4 = 32 ký tự hex. Mặc dù mỗi "char" sẽ được mã hóa dưới dạng utf8 hoặc ascii, điều này sẽ làm cho kích thước biểu diễn hex 32 * 8 = 256 bit.
Gaston Sanchez

2
Đây là một câu trả lời thực sự kém. Câu trả lời của tôi đi vào chi tiết về vấn đề này: stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay "vì vậy 1 byte là 2 ký tự có nghĩa là 16 bit là 2 ký tự" - 1 byte! = 16 bit.
David Klempfner

36

Tôi muốn tổng hợp một số câu trả lời vào một bài đăng.

Đầu tiên, đừng nghĩ băm MD5 là một chuỗi ký tự mà là một số hex. Do đó, mỗi chữ số là một chữ số hex (0-15 hoặc 0-F) và đại diện cho bốn bit, không phải tám.

Xa hơn nữa, một byte hoặc tám bit được biểu diễn bằng hai chữ số hex, ví dụ b ' 1111 1111' = 0xFF= 255.

Hàm băm MD5 có độ dài 128 bit và thường được biểu diễn bằng 32 chữ số hex.

Hàm băm SHA-1 có độ dài 160 bit và thường được biểu diễn bằng 40 chữ số hex.

Đối với họ SHA-2, tôi nghĩ độ dài băm có thể là một trong những tập được xác định trước. Vì vậy SHA-512 có thể được biểu diễn bằng 128 chữ số hex.

Một lần nữa, bài đăng này chỉ dựa trên các câu trả lời trước đó.


26

"Ký tự" hex (nibble) khác với "ký tự"

Để rõ ràng về các bit so với byte, và các ký tự.

  • 1 byte là 8 bit (cho mục đích của chúng tôi)
  • 8 bit cung cấp 2**8các kết hợp có thể có: 256 kết hợp

Khi bạn nhìn vào một ký tự hex,

  • 16 kết hợp của [0-9] + [a-f]: đầy đủ các0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 nhỏ hơn 256, vì vậy một ký tự hex không lưu trữ một byte.
  • 16 là 2**4: nghĩa là một ký tự hex có thể lưu trữ 4 bit trong một byte (nửa byte).
  • Do đó, hai ký tự hex, có thể lưu trữ 8 bit, 2**8kết hợp.
  • Một byte được biểu diễn dưới dạng ký tự hex là [0-9a-f][0-9a-f]và đại diện cho cả nửa byte (chúng tôi gọi nửa byte là nibble ).

Khi bạn nhìn vào một ký tự byte đơn thông thường, (chúng tôi sẽ hoàn toàn bỏ qua các ký tự nhiều byte và ký tự rộng ở đây)

  • Nó có thể lưu trữ hơn 16 tổ hợp.
  • Khả năng của ký tự được xác định bởi mã hóa. Ví dụ: ISO 8859-1 lưu trữ toàn bộ byte, lưu trữ tất cả những thứ này
  • Tất cả những thứ đó chiếm toàn bộ 2**8phạm vi.
  • Nếu một ký tự hex trong một md5()có thể lưu trữ tất cả những điều đó, bạn sẽ thấy tất cả các chữ cái thường, tất cả các chữ cái viết hoa, tất cả các dấu câu và những thứ như ¡°ÀÐàð, khoảng trắng như (dòng mới và tab) và các ký tự điều khiển (mà bạn có thể ' thậm chí không thấy và nhiều trong số đó không được sử dụng).

Vì vậy, chúng rõ ràng là khác nhau và tôi hy vọng điều đó cung cấp sự phân tích tốt nhất về sự khác biệt.


1
Điều này "Theo thứ tự thực sự là đặc điểm kỹ thuật hoặc phụ thuộc vào nền tảng" thực sự có nghĩa là gì? Rất thích xem điều này được giải thích thêm một chút.
KumarM

@KumarM Tôi sẽ xóa điều đó vì tôi không nghĩ nó thực sự liên quan đến cuộc trò chuyện và nó bị nói xấu.
Evan Carroll

22

MD5 mang lại các chữ số thập lục phân (0-15 / 0-F), vì vậy chúng có bốn bit. 128/4 = 32 ký tự.

SHA-1 cũng cung cấp các chữ số thập lục phân (0-15 / 0-F), do đó 160/4 = 40 ký tự.

(Vì chúng là các phép toán, đầu ra của hầu hết các hàm băm thường được biểu diễn dưới dạng chữ số hex.)

Có thể bạn đang nghĩ đến các ký tự văn bản ASCII, có 8 bit.


cảm ơn bạn rất nhiều .. tôi có hình ảnh rõ ràng hơn trong đầu của tôi bây giờ !!
hash_jr90

lưu ý: ascii-charset chứa các ký hiệu không in được.
Roy Lee

Tôi đã cố gắng phân tích điều này một cách rõ ràng hơn một chút stackoverflow.com/a/41618070/124486
Evan Carroll


2

Đó là các chữ số thập phân, không phải ký tự. Một chữ số = 4 bit.


2

Chúng không thực sự là các ký tự, chúng là các chữ số thập lục phân.


2

Một chữ số hex = 1 nibble (bốn bit)

Hai chữ số hex = 1 byte (tám bit)

MD5 = 32 chữ số hex

32 chữ số hex = 16 byte (32/2)

16 byte = 128 bit (16 * 8)

Điều tương tự cũng áp dụng cho SHA-1 ngoại trừ nó dài 40 chữ số hex.

Tôi hi vọng cái này giúp được.

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.