2011-06-11 20 views
58

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

  • 1 byte son 8 bits
  • si 1 carácter es de 1 byte
  • entonces 128 bits es 128/8 = 16 bytes correcto?

EDIT:

SHA-1 produce 160 bits, por lo que el número de caracteres hay?

+0

¿Puedes publicar un vínculo a los documentos a los que haces referencia? –

+0

@don: Lo siento, es mi conferenciante notas. Pero ba__friend ha respondido mi pregunta, y la pruebo aquí: http://www.miraclesalad.com/webtools/md5.php, y solo sus caracteres son realmente hexadecimales, ahora tiene mucho más sentido para mí. Voy a votar su respuesta como la mejor respuesta –

+0

Creo que mi respuesta entra en más detalles sobre esto que cualquier otra. [Si es nuevo en la programación de computadoras y hace esta pregunta y quiere una respuesta directa] (http://stackoverflow.com/a/41618070/124486) –

Respuesta

80

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

+1

hexadecimal es de 0 ... F? –

+1

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

+0

así que 1 byte es 2 caracteres, lo que significa que 16 bits son 2 caracteres y luego 128/16 = 8. Entonces, ¿se requieren 8 de 2 caracteres = 16 caracteres? ¿Por qué 32? –

6

Eso es 32 caracteres hexadecimales - 1 carácter hexadecimal es de 4 bits.

0

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

0

En realidad no son caracteres, son dígitos hexadecimales.

15

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

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

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

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

+0

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

+0

nota: ascii-charset contiene símbolos no imprimibles. – Roylee

+0

Traté de romper esto un poco más explícitamente http://stackoverflow.com/a/41618070/124486 –

22

Yo quería summerize algunas de las respuestas en una sola 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.

Tomando eso en cuenta, un byte u ocho bits están representados por dos dígitos hexadecimales, p. Ej. b '1111 1111' = 0xFF = 255.

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

Los hash SHA-1 tienen una longitud de 160 bits 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 puede ser representado por 128 dígitos hexadecimales.

Una vez más, esta publicación solo se basa en respuestas anteriores.

10

un "carácter" hexagonal (nibble) es diferente de un "carácter"

ser claro en los bits vs bytes, vs caracteres.

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

Cuando nos fijamos en un personaje hexagonal,

  • 16 combinaciones de [0-9] + [a-f]: el rango completo de 0,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 hace 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 combinaciones de 8 bits, 2**8.
  • Un byte representado como un carácter hexadecimal es [0-9a-f][0-9a-f] y representa las dos partes de un byte (llamamos medio byte a nibble). En este orden, en realidad depende de la plataforma o de las especificaciones: 0F puede representar 00001111 o 11110000.

Cuando nos fijamos en un personaje regular ,

  • Es capaz de almacenar más de 16 combinaciones.
  • Las capacidades del carácter están determinadas por la codificación . Por ejemplo, ISO 8859-1 that stores an entire byte, stores all this stuff
  • Todo eso lleva todo el rango de 2**8.
  • Si un carácter hexadecimal en un md5() pudiera almacenar todo eso, vería todas las letras minúsculas, todas las letras mayúsculas, todos los signos de puntuación y cosas como ¡°ÀÐàð, espacios en blanco (líneas nuevas y pestañas) y caracteres de control (que ni siquiera puedes ver y muchos de los cuales no están en uso).

Por lo tanto, son claramente diferentes y espero que proporcione el mejor desglose de las diferencias.

Cuestiones relacionadas