MD5 is 128 bits but why is it 32 characters?

128,394

Solution 1

32 chars as hexdecimal representation, thats 2 chars per byte.

Solution 2

I wanted summerize some of the answers into one post.

First, don't think of the MD5 hash as a character string but as a hex number. Therefore, each digit is a hex digit (0-15 or 0-F) and represents four bits, not eight.

Taking that further, one byte or eight bits are represented by two hex digits, e.g. b'1111 1111' = 0xFF = 255.

MD5 hashes are 128 bits in length and generally represented by 32 hex digits.

SHA-1 hashes are 160 bits in length and generally represented by 40 hex digits.

For the SHA-2 family, I think the hash length can be one of a pre-determined set. So SHA-512 can be represented by 128 hex digits.

Again, this post is just based on previous answers.

Solution 3

A hex "character" (nibble) is different from a "character"

To be clear on the bits vs byte, vs characters.

  • 1 byte is 8 bits (for our purposes)
  • 8 bits provides 2**8 possible combinations: 256 combinations

When you look at a hex character,

  • 16 combinations of [0-9] + [a-f]: the full range of 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 is less than 256, so one one hex character does not store a byte.
  • 16 is 2**4: that means one hex character can store 4 bits in a byte (half a byte).
  • Therefore, two hex characters, can store 8 bits, 2**8 combinations.
  • A byte represented as a hex character is [0-9a-f][0-9a-f] and that represents both halfs of a byte (we call a half-byte a nibble).

When you look at a regular single-byte character, (we're totally going to skip multi-byte and wide-characters here)

  • It can store far more than 16 combinations.
  • The capabilities of the character are determined by the encoding. For instance, the ISO 8859-1 that stores an entire byte, stores all this stuff
  • All that stuff takes the entire 2**8 range.
  • If a hex-character in an md5() could store all that, you'd see all the lowercase letters, all the uppercase letters, all the punctuation and things like ¡°ÀÐàð, whitespace like (newlines, and tabs), and control characters (which you can't even see and many of which aren't in use).

So they're clearly different and I hope that provides the best break down of the differences.

Solution 4

MD5 yields hexadecimal digits (0-15 / 0-F), so they are four bits each. 128 / 4 = 32 characters.

SHA-1 yields hexadecimal digits too (0-15 / 0-F), so 160 / 4 = 40 characters.

(Since they're mathematical operations, most hashing functions' output is commonly represented as hex digits.)

You were probably thinking of ASCII text characters, which are 8 bits.

Solution 5

One hex digit = 1 nibble (four-bits)

Two hex digits = 1 byte (eight-bits)

MD5 = 32 hex digits

32 hex digits = 16 bytes ( 32 / 2)

16 bytes = 128 bits (16 * 8)

The same applies to SHA-1 except it's 40 hex digits long.

I hope this helps.

Share:
128,394
hash_jr90
Author by

hash_jr90

Updated on July 14, 2021

Comments

  • hash_jr90
    hash_jr90 almost 3 years

    I read some docs about md5, it said that its 128 bits, but why is it 32 characters? I can't compute the characters.

    • 1 byte is 8 bits
    • if 1 character is 1 byte
    • then 128 bits is 128/8 = 16 bytes right?

    EDIT:

    SHA-1 produces 160 bits, so how many characters are there?

  • ba__friend
    ba__friend about 13 years
    1 byte is represented by a two digit hexdecimal number, like 255 = ff.
  • hash_jr90
    hash_jr90 about 13 years
    thank you so much.. i have much more clearer picture in my head now!!
  • Koray Tugay
    Koray Tugay almost 10 years
    so 1 byte is 2 chars which means 16 bits is 2 chars then 128/16 = 8. So 8 of 2 chars = 16 chars is required then? Why 32?
  • Gaston Sanchez
    Gaston Sanchez over 9 years
    Because each hex character can be represented by 4 bits. So if it is 128 bits it is 128/4 = 32 hex characters. Even though each "char" will be encoded as a utf8 or ascii which will make the hex representation size 32*8= 256 bits.
  • Roy Lee
    Roy Lee almost 8 years
    note: ascii-charset contains non-printable symbols.
  • Evan Carroll
    Evan Carroll over 7 years
    This is a really poor answer. My answer goes into details on this: stackoverflow.com/a/41618070/124486
  • Evan Carroll
    Evan Carroll over 7 years
    I tried to break this down a little more explicitly stackoverflow.com/a/41618070/124486
  • David Klempfner
    David Klempfner about 6 years
    @KorayTugay "so 1 byte is 2 chars which means 16 bits is 2 chars" - 1 byte != 16 bits.
  • KumarM
    KumarM over 5 years
    What does this "In which order is actually spec or platform dependent" actually mean? Would love to see this explained a bit more.
  • Evan Carroll
    Evan Carroll over 5 years
    @KumarM I'm going to delete that because I don't think it's actually relevant to the conversation at all, and it's badly worded.