2011-10-15 21 views
9

In http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml viene fornito un esempio su come calcolare un hash MD5 di stringa. Ciò si traduce in una stringa esadecimale a 20 cifre. Secondo http://en.wikipedia.org/wiki/MD5 mi aspetterei una stringa esadecimale a 32 cifre. Ad esempio, ottengo lo stesso risultato utilizzando la risposta dac2009 in How can I generate an MD5 hash?.Java calcolare hash MD5

Perché ottengo qualcosa che sembra un hash MD5 ma non lo è? Non riesco a immaginare che tutte le stringhe che ottengo debbano essere riempite con 12 zeri iniziali.

Edit: un codice di esempio

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); 
} 

Tratto da http://snippets.dzone.com/posts/show/3686

+0

Il tuo primo collegamento è un 404 – Paul

+2

Inserisci un breve esempio (completo) di codice che mostri il problema che stai riscontrando. Senza di ciò, non possiamo dirti cosa stai facendo male :) Il metodo descritto nella domanda StackOverflow a cui ti colleghi è come generi un hash MD5 che è in effetti 32 caratteri esadecimali –

+0

Il primo link funziona qui ... – AndyAndroid

risposta

3

Il codice esempio che hai collegato, è secondo me un brutto codice . Sembra che l'autore non sappia come funziona un computer. Tuttavia, ci sono esempi migliori.

L'ultimo esempio è quello che si sta cercando. Chech questo Ideone: http://ideone.com/ZeN8a


Aggiornamento 0: non ho mai visto prima di questo modo di formattazione di una stringa ("%1$032X"), quindi non so che cosa fa. Sono necessari 128 bit per rappresentare l'hash MD5 e suggerirei di utilizzare il metodo toString(16) di BigInteger stesso per creare una rappresentazione String del BigInteger invece di utilizzare quel formato.

String hashtext = bigInt.toString(16); 

Update 1: Io davvero non so più che cosa c'è di sbagliato con il codice fornito. Prova questo:

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

E se ancora produce ancora 20 cifre, provare a reinstallare Java. Sono fuori di ispirazione.

+0

Ho fatto ciò che è dato nel primo link -> 20 caratteri, ho guardato il secondo link -> commento a quel post: ignora gli spazi vuoti finali. Quindi nessuno dei due metodi sembra funzionare correttamente. hai avuto successo nell'esecuzione di questi? – AndyAndroid

+0

ok ho cambiato la mia dichiarazione di ritorno in "return i.toString (16);". Sto ancora ottenendo lo stesso risultato. 20 cifre. Hai eseguito il codice e hai 32 cifre? – AndyAndroid

+0

reinstallare non è possibile, funziona su un telefono Android, ma hai ragione ho provato in una semplice installazione desktop java, ci sono 32 cifre. Forse un bug in Android. Grazie per tutto il vostro aiuto. – AndyAndroid

40

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

DigestUtils.md5Hex(str); 

questo vi darà 32 stringa char a seguito

+2

dato che si tratta di un'app per dispositivi mobili, non voglio utilizzare alcun pacchetto aggiuntivo, piuttosto rimango con "plain java". – AndyAndroid

+5

il titolo dell'argomento è fuorviante, perché non vi è alcuna menzione sul cellulare. per esempio questa risposta è utile e semplice per me, perché cerco un semplice esempio di java. questa risposta è perfetta per me :) – sarkiroka

+1

@sarkiroka se il titolo/i tag hanno menzionato "mobile", potresti non aver provato ad aprire questa pagina. Se l'OP non preferisce una risposta specifica, ha il diritto di farlo. Non c'è bisogno di prenderlo come un reato. :) – Sufian

1

Ho provato il tuo esempio sopra, MungPass ("java") e ho ottenuto una stringa di 32 cifre, 93f725a07423fe1c889f448b33d21f46. Dal momento che hai ottenuto il primo dei 20 corretti quando corri, immagino che ti manchi semplicemente qualcosa nella stampa?

Problemi correlati