MD5 tiene 128 bits, pero ¿por qué tiene 32 caracteres?


95

Leí algunos documentos sobre md5, decía que son 128 bits, pero ¿por qué son 32 caracteres? No puedo calcular los caracteres.

  • 1 byte son 8 bits
  • si 1 carácter es 1 byte
  • entonces 128 bits es 128/8 = 16 bytes, ¿verdad?

EDITAR:

SHA-1 produce 160 bits, entonces, ¿cuántos caracteres hay?


¿Puede publicar un enlace a los documentos a los que hace referencia?
Don Roby

@don: Lo siento, son mis notas de conferenciante. Pero ba__friend ha respondido a mi pregunta, y la pruebo aquí: miraclesalad.com/webtools/md5.php , y sus caracteres realmente hexadecimales solo, tiene mucho más sentido para mí ahora.
Votaré

Creo que mi respuesta es más detallada sobre esto que sobre cualquier otra. Si es nuevo en la programación de computadoras y hace esta pregunta y desea una respuesta completa
Evan Carroll

9
No es una pregunta tonta. Érase una vez tampoco sabías cuántos caracteres HEX representaban un byte.
David Klempfner

Una línea rápida de Python One para calcular la longitud de bits de un hash es ((1 << (n*4))-1).bit_length()donde n es la longitud del hash en hexadecimal
Wouterr

Respuestas:


107

32 caracteres como representación hexadecimal, eso es 2 caracteres por byte.


1
1 byte está representado por un número hexadecimal de dos dígitos, como 255 = ff.
ba__friend

1
entonces 1 byte son 2 caracteres, lo que significa que 16 bits son 2 caracteres, luego 128/16 = 8. Entonces, ¿se requieren 8 de 2 caracteres = 16 caracteres? ¿Por qué 32?
Koray Tugay

15
Porque cada carácter hexadecimal se puede representar con 4 bits. Entonces, si es de 128 bits, es 128/4 = 32 caracteres hexadecimales. Aunque cada "char" se codificará como utf8 o ascii, lo que hará que el tamaño de representación hexadecimal sea de 32 * 8 = 256 bits.
Gaston Sanchez

2
Ésta es una respuesta realmente pobre. Mi respuesta entra en detalles sobre esto: stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay "entonces 1 byte son 2 caracteres, lo que significa que 16 bits son 2 caracteres" - 1 byte! = 16 bits.
David Klempfner

36

Quería resumir algunas de las respuestas en una publicación.

Primero, no piense en el hash MD5 como una cadena de caracteres, sino como un número hexadecimal. Por lo tanto, cada dígito es un dígito hexadecimal (0-15 o 0-F) y representa cuatro bits, no ocho.

Yendo más allá, un byte u ocho bits están representados por dos dígitos hexadecimales, por ejemplo, b ' 1111 1111' = 0xFF= 255.

Los hash MD5 tienen una longitud de 128 bits y generalmente están representados por 32 dígitos hexadecimales.

Los hashes SHA-1 tienen 160 bits de longitud y generalmente están representados por 40 dígitos hexadecimales.

Para la familia SHA-2, creo que la longitud del hash puede ser una de un conjunto predeterminado. Entonces SHA-512 se puede representar con 128 dígitos hexadecimales.

Nuevamente, esta publicación se basa solo en respuestas anteriores.


26

Un "carácter" hexadecimal (nibble) es diferente de un "carácter"

Para ser claros en los bits frente a bytes, frente a caracteres.

  • 1 byte son 8 bits (para nuestros propósitos)
  • 8 bits proporciona 2**8combinaciones posibles: 256 combinaciones

Cuando miras un carácter hexadecimal,

  • 16 combinaciones de [0-9] + [a-f]: la gama completa de0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 es menor que 256, por lo que un carácter hexadecimal no almacena un byte.
  • 16 es 2**4: eso significa que un carácter hexadecimal puede almacenar 4 bits en un byte (medio byte).
  • Por lo tanto, dos caracteres hexadecimales pueden almacenar 2**8combinaciones de 8 bits .
  • Un byte representado como un carácter hexadecimal es [0-9a-f][0-9a-f]y que representa las dos mitades de un byte (a un medio byte lo llamamos nibble ).

Cuando observa un carácter normal de un solo byte, (aquí vamos a omitir totalmente los caracteres de varios bytes y los caracteres anchos)

  • Puede almacenar más de 16 combinaciones.
  • Las capacidades del carácter están determinadas por la codificación. Por ejemplo, la ISO 8859-1 que almacena un byte completo, almacena todas estas cosas
  • Todo eso ocupa toda la 2**8gama.
  • Si un carácter hexadecimal en un md5()pudiera almacenar todo eso, verías todas las letras minúsculas, todas las letras mayúsculas, toda la puntuación y cosas como ¡°ÀÐàðespacios en blanco como (líneas nuevas y tabulaciones) y caracteres de control (que puedes ' ni siquiera veo y muchos de los cuales no están en uso).

Entonces son claramente diferentes y espero que eso proporcione el mejor desglose de las diferencias.


1
¿Qué significa realmente este "En qué orden depende realmente la plataforma o la especificación"? Me encantaría ver esto explicado un poco más.
KumarM

@KumarM Voy a eliminar eso porque no creo que sea realmente relevante para la conversación, y está mal redactado.
Evan Carroll

22

MD5 produce dígitos hexadecimales (0-15 / 0-F), por lo que son cuatro bits cada uno. 128/4 = 32 caracteres.

SHA-1 también produce dígitos hexadecimales (0-15 / 0-F), por lo que 160/4 = 40 caracteres.

(Dado que son operaciones matemáticas, la salida de la mayoría de las funciones hash se representa comúnmente como dígitos hexadecimales).

Probablemente estaba pensando en caracteres de texto ASCII, que son de 8 bits.


muchas gracias ... tengo una imagen mucho más clara en mi cabeza ahora !!
hash_jr90

nota: ascii-charset contiene símbolos no imprimibles.
Roy Lee

Traté de desglosar esto un poco más explícitamente stackoverflow.com/a/41618070/124486
Evan Carroll


2

Esos son dígitos hexadecimales, no caracteres. Un dígito = 4 bits.



2

Un dígito hexadecimal = 1 nibble (cuatro bits)

Dos dígitos hexadecimales = 1 byte (ocho bits)

MD5 = 32 dígitos hexadecimales

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

16 bytes = 128 bits (16 * 8)

Lo mismo se aplica a SHA-1, excepto que tiene 40 dígitos hexadecimales.

Espero que esto ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.