MD5 tem 128 bits, mas por que tem 32 caracteres?

99

Eu li alguns documentos sobre md5, dizia que são 128 bits, mas por que são 32 caracteres? Não consigo calcular os caracteres.

  • 1 byte é 8 bits
  • se 1 caractere for 1 byte
  • então 128 bits é 128/8 = 16 bytes, certo?

EDITAR:

O SHA-1 produz 160 bits, então quantos caracteres existem?

hash_jr90
fonte
Você pode postar um link para os documentos que você faz referência?
Don Roby
@don: Desculpe, são minhas notas de palestrante. Mas ba__friend respondeu à minha pergunta e eu testei aqui: miraclesalad.com/webtools/md5.php , e seus caracteres realmente hexadecimais apenas, faz muito mais sentido para mim agora. Vou votar sua resposta como a melhor resposta
hash_jr90
Acho que minha resposta é mais detalhada sobre isso do que qualquer outra. Se você é novo em programação de computadores e está fazendo esta pergunta e quer uma resposta
direta
9
Não é uma pergunta boba. Era uma vez você também não sabia quantos HEX chars representava um byte.
David Klempfner,
Um rápido python one liner para calcular o comprimento do bit de um hash é ((1 << (n*4))-1).bit_length()onde n é o comprimento do hash em hexadecimal
Wouterr

Respostas:

110

32 caracteres como representação hexdecimal, ou seja, 2 caracteres por byte.

ba__amigo
fonte
1
1 byte é representado por um número hexdecimal de dois dígitos, como 255 = ff.
ba__friend
1
então 1 byte é 2 caracteres, o que significa que 16 bits são 2 caracteres, então 128/16 = 8. Então, 8 de 2 caracteres = 16 caracteres são necessários? Por que 32?
Koray Tugay
18
Porque cada caractere hexadecimal pode ser representado por 4 bits. Portanto, se for de 128 bits, será de 128/4 = 32 caracteres hexadecimais. Mesmo que cada "char" seja codificado como um utf8 ou ascii, o que tornará o tamanho da representação hexadecimal de 32 * 8 = 256 bits.
Gaston Sanchez
2
Esta é uma resposta muito pobre. Minha resposta entra em detalhes sobre isso: stackoverflow.com/a/41618070/124486
Evan Carroll
@KorayTugay "então 1 byte é 2 caracteres, o que significa que 16 bits é 2 caracteres" - 1 byte! = 16 bits.
David Klempfner,
37

Eu queria resumir algumas das respostas em um post.

Primeiro, não pense no hash MD5 como uma string de caracteres, mas como um número hexadecimal. Portanto, cada dígito é um dígito hexadecimal (0-15 ou 0-F) e representa quatro bits, não oito.

Indo além, um byte ou oito bits são representados por dois dígitos hexadecimais, por exemplo, b ' 1111 1111' = 0xFF= 255.

Os hashes MD5 têm 128 bits de comprimento e geralmente são representados por 32 dígitos hexadecimais.

Os hashes SHA-1 têm 160 bits de comprimento e geralmente são representados por 40 dígitos hexadecimais.

Para a família SHA-2, acho que o comprimento do hash pode ser um de um conjunto pré-determinado. Portanto, o SHA-512 pode ser representado por 128 dígitos hexadecimais.

Novamente, esta postagem é baseada apenas em respostas anteriores.

RepentantFan
fonte
27

Um "personagem" hexadecimal (nibble) é diferente de um "personagem"

Para ser claro quanto aos bits vs bytes, vs caracteres.

  • 1 byte equivale a 8 bits (para nossos propósitos)
  • 8 bits fornecem 2**8combinações possíveis: 256 combinações

Quando você olha para um personagem hexadecimal,

  • 16 combinações de [0-9] + [a-f]: a gama completa de0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 é menor que 256, portanto, um caractere hexadecimal não armazena um byte.
  • 16 é 2**4: isso significa que um caractere hexadecimal pode armazenar 4 bits em um byte (meio byte).
  • Portanto, dois caracteres hexadecimais podem armazenar 2**8combinações de 8 bits .
  • Um byte representado como um caractere hexadecimal é [0-9a-f][0-9a-f]e que representa as duas metades de um byte (chamamos meio byte de nibble ).

Quando você olha para um caractere regular de byte único, (vamos pular totalmente os caracteres multibyte e largos aqui)

  • Ele pode armazenar muito mais de 16 combinações.
  • As capacidades do personagem são determinadas pela codificação. Por exemplo, a ISO 8859-1 que armazena um byte inteiro, armazena todas essas coisas
  • Tudo isso abrange toda a 2**8gama.
  • Se um caractere hexadecimal em um md5()pudesse armazenar tudo isso, você veria todas as letras minúsculas, todas as letras maiúsculas, toda a pontuação e coisas como ¡°ÀÐàð, espaços em branco como (novas linhas e tabulações) e caracteres de controle (que você pode ' nem mesmo vejo e muitos dos quais não estão em uso).

Portanto, eles são claramente diferentes e espero que forneça o melhor detalhamento das diferenças.

Evan Carroll
fonte
1
O que significa "Em que ordem é realmente dependente da especificação ou plataforma"? Adoraria ver isso explicado um pouco mais.
KumarM
@KumarM Vou deletar isso porque não acho que seja realmente relevante para a conversa e está mal redigido.
Evan Carroll
23

MD5 produz dígitos hexadecimais (0-15 / 0-F), portanto, eles têm quatro bits cada. 128/4 = 32 caracteres.

SHA-1 também produz dígitos hexadecimais (0-15 / 0-F), então 160/4 = 40 caracteres.

(Como são operações matemáticas, a saída da maioria das funções de hash é comumente representada como dígitos hexadecimais.)

Você provavelmente estava pensando em caracteres de texto ASCII, que são de 8 bits.

Wiseguy
fonte
muito obrigado .. eu tenho uma imagem muito mais clara na minha cabeça agora !!
hash_jr90
nota: ascii-charset contém símbolos não imprimíveis.
Roy Lee
Tentei decompô-lo um pouco mais explicitamente stackoverflow.com/a/41618070/124486
Evan Carroll
9

São 32 caracteres hexadecimais - 1 caractere hexadecimal tem 4 bits.

Brett Thomas
fonte
3

Um dígito hexadecimal = 1 nibble (quatro bits)

Dois dígitos hexadecimais = 1 byte (oito bits)

MD5 = 32 dígitos hexadecimais

32 dígitos hexadecimais = 16 bytes (32/2)

16 bytes = 128 bits (16 * 8)

O mesmo se aplica ao SHA-1, exceto que possui 40 dígitos hexadecimais.

Eu espero que isso ajude.

Chuva
fonte
2

Esses são dígitos hexadecimais, não caracteres. Um dígito = 4 bits.

EAolson
fonte
2

Eles não são realmente caracteres, são dígitos hexadecimais.

Jack Edmonds
fonte