2010-11-25 30 views
11

Si tengo una cadena de 32 caracteres (un hash MD5) y la codifico usando Base64, ¿cuál es la longitud máxima de la cadena codificada?MD5 codificación Hash y Base64

+5

Si tiene una cadena de 32 caracteres que es un hash MD5, entonces ya está codificada en hexadecimal y no hay necesidad de codificarla en base64. –

+1

¡Un hash MD5 no es hexadecimal! Tiene 16 bytes: hexadecimal es simplemente una representación convencional. –

+2

@GregS, tiene razón en que un hash MD5 se representa típicamente en formato hexadecimal, que es un subconjunto de Base64. Pero hay un propósito para convertir a Base64: Base64 toma menos caracteres porque tiene un juego de caracteres más grande. Le ahorrará espacio en disco cuando esté guardando en texto sin formato o en un esquema de codificación de caracteres si usa la notación Base64 (22 caracteres) en lugar de la hexadecimal (32 caracteres). –

Respuesta

31

Un valor MD5 es siempre 22 caracteres (útiles) de longitud en notación Base64. Muchos algoritmos de Base64 también agregarán 2 caracteres de relleno al codificar un hash MD5, lo que da un total de 24 caracteres. El relleno no agrega información útil y puede descartarse. Solo los primeros 22 caracteres importan.

He aquí por qué:

Un hash MD5 es un valor de 128 bits. Cada carácter en una cadena Base64 contiene 6 bits de información, porque hay 64 valores posibles para el personaje, y se necesitan 6 potencias de 2 para llegar a 64. Con 6 bits de información en cada carácter, 21 caracteres tienen 126 bits de información, y 22 caracteres contienen 132 bits de información. Como 128 bits no caben dentro de 21 caracteres, pero caben dentro de 22 caracteres (con un poco de espacio libre), un valor de 128 bits siempre se representará como 22 caracteres en Base64.

Una nota sobre el relleno:

he mencionado anteriormente que muchos algoritmos de codificación Base64 añadir un par de caracteres de relleno cuando codifica un valor MD5. Esto se debe a que Base64 representa 3 bytes de información como 4 caracteres. Como MD5 tiene 16 bytes de información, muchos algoritmos de codificación Base64 añaden "==" para designar que la entrada de 16 bytes tenía 2 bytes menos que el siguiente múltiplo de 3, que habría sido de 18 bytes. Estos 2 signos iguales no agregan información alguna a la cadena y pueden descartarse durante el almacenamiento.

7

Según http://en.wikipedia.org/wiki/Base64

"Tenga en cuenta que dada una entrada de n bytes, la salida será (n + 2 - ((n + 2)% 3))/3 * 4 bytes de largo, que converge a n * 4/3 o 1.33333n para n grande. "

Entonces, será ((32 + 2 - (32 + 2)% 3))/3 * 4 = 34 - (34% 3)/3 * 4 = (34 - 1)/3 * 4 = 33/3 * 4 = 44 caracteres.

Siempre se puede extraer en formato binario sin procesar (128 bits) y codificarlo directamente en la base 64, lo que significa convertir 16 bytes en lugar de 32, que se convierte en 24 bytes cuando se codifica la base 64.

+5

Un hash md5 es de 128 bits, que codificaría para 24 base64 caracteres. –

+0

Gracias Arantor! ¡Respuesta perfecta! –

+0

@ GregS, lo siento, sí, estaba pensando en SHA1, que es de 160 bits. – Arantor