2011-10-15 34 views
9

En http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml se da un ejemplo de cómo calcular un hash MD5 de String. Esto da como resultado una cadena hexadecimal de 20 dígitos. De acuerdo con http://en.wikipedia.org/wiki/MD5 esperaría una cadena hexadecimal de 32 dígitos. Obtengo el mismo resultado, por ejemplo, usando la respuesta dac2009 en How can I generate an MD5 hash?.Java calcular hash MD5

¿Por qué obtengo algo que parece un hash MD5 pero no lo es? No me puedo imaginar que todas las cadenas que tengo que rellenar con 12 ceros a la izquierda.

Editar: un ejemplo de código

public static String MungPass(String pass) throws NoSuchAlgorithmException { 
    MessageDigest m = MessageDigest.getInstance("MD5"); 
    byte[] data = pass.getBytes(); 
    m.update(data,0,data.length); 
    BigInteger i = new BigInteger(1,m.digest()); 
    return String.format("%1$032X", i); 
} 

Tomado de http://snippets.dzone.com/posts/show/3686

+0

Su primer enlace es un 404 – Paul

+2

Por favor, publique un código de ejemplo corto (completo) que demuestre el problema que está teniendo. Sin eso, no podemos decirte lo que estás haciendo mal :) El método descrito en la pregunta StackOverflow a la que te vinculas es cómo generar un hash MD5 que de hecho tiene 32 caracteres hexadecimales –

+0

El primer enlace funciona aquí ... – AndyAndroid

Respuesta

3

El código ejemplo que ha vinculado, en mi opinión es un código incorrecto . Parece que el autor no sabe cómo funciona una computadora. Sin embargo, hay ejemplos mucho mejores.

El último ejemplo es el que usted está buscando. Chech este Ideone: http://ideone.com/ZeN8a


Actualización de 0: nunca he visto antes esta manera de dar formato a una cadena ("%1$032X"), por lo que no sabe lo que hace. Necesita 128 bits para representar el hash MD5 y le sugiero que use el método toString(16) de BigInteger para crear una representación de cadena del BigInteger en lugar de usar ese formato.

String hashtext = bigInt.toString(16); 

Actualización 1: Realmente ya no sé lo que está mal con el código proporcionado. Pruebe esto:

System.out.println(MungPass("java")); 

Y si eso todavía produce 20 dígitos, intente reinstalar Java. Estoy sin inspiración.

+0

Hice lo que se da en el primer enlace -> 20 caracteres, miré el segundo enlace -> comento a esa publicación: ignora los espacios en blanco finales. Entonces ninguno de los dos métodos funciona bien. ¿Tuviste éxito al ejecutar esto? – AndyAndroid

+0

bien, cambié mi declaración de devolución para "devolver i.toString (16);". Todavía estoy obteniendo el mismo resultado. 20 dígitos ¿Ejecutó el código y obtuvo 32 dígitos? No es posible volver a instalar – AndyAndroid

+0

, se ejecuta en un teléfono Android, pero tiene razón, lo intenté en una instalación java de escritorio simple, allí son 32 dígitos. Tal vez un error en Android. Gracias por toda tu ayuda. – AndyAndroid

40

uso org.apache.commons.codec.digest.DigestUtils lugar:

DigestUtils.md5Hex(str); 

esto le dará 32 char string como resultado

+2

ya que es una aplicación móvil No quiero utilizar ningún paquete adicional, sino que me quedaría con "Java simple". – AndyAndroid

+5

el título del tema es engañoso, porque no hay ninguna mención sobre el móvil. por ejemplo, esta respuesta es útil y simple para mí, porque busco un ejemplo simple de Java. esta respuesta es perfecta para mí :) – sarkiroka

+1

@sarkiroka si el título/etiquetas ha mencionado "móvil", es posible que tampoco hayas intentado abrir esta página. Si el OP no prefiere una respuesta específica, tiene el derecho de hacerlo. No es necesario tomarlo como una ofensa. :) – Sufian

1

He probado su ejemplo anterior, MungPass ("java") y obtuve una cadena de 32 dígitos, 93f725a07423fe1c889f448b33d21f46. Como obtuviste los 20 primeros correctos cuando corres, supongo que simplemente te estás perdiendo algo en la impresión.

Cuestiones relacionadas