Sto facendo un piccolo sistema p2p per un progetto dell'università.
Ho pensato di utilizzare md5 sia per avere un'impronta di file da usare come "chiave" nelle richieste di file ad un client, sia come verifica del corretto download del file.

Avevo trovato su questo forum una implementazione e senza pensarci troppo su l'ho usata.. se non che mi sono accorto che è molto lenta (praticamente con file sopra i100kb le attese diventano lunghe.. sul mega siamo ad un'attesa apparentemente infinita).

L'implementazione è questa:


codice:
import java.security.*;
import java.io.*;

public class Md5
{
	private String hash;
	
	private String hex(byte[] array)
	{
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < array.length; i++)
		{
			sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toLowerCase().substring(1,3));
		}
		return sb.toString();
	}
  
	public Md5 (String message)
	{
		try
		{
			MessageDigest md = MessageDigest.getInstance("MD5");
			hash = hex (md.digest(message.getBytes("CP1252")));
		}
		catch (NoSuchAlgorithmException e) 
		{
			e.printStackTrace();
		}
		catch (UnsupportedEncodingException e) 
		{
			e.printStackTrace();
		}
	}
	
	public String getHash()
	{
  		return hash;
	}
}
ho aggiunto solo il metodo getHash() per evitare di accedere alla variabile di classe dall'esterno come faceva chi l'ha postata sul forum.

Bene... adesso mi sono messo alla ricerca di un'implementazione più veloce e ho trovato in un altro post questo link:
http://www.pierotofy.it/pages/sorgenti/browse/14628/
provando il codice si vede che è infinitamente più veloce.. ma restituisce l'md5 sotto forma di array di byte..

morale:
l'md5 di un file che contiene solo "ciao" è
6e6bc4e49dd477ebc98ef4046c067b5f
secondo la classe "lenta", e
[B@8814e9
secondo quella veloce

Adesso.. non sono un espertone di Java.. praticamente è la prima esperienza che vada oltre la didattica essenziale, ma non riesco a capire se sia possibile ottenere una stringa come quella data dal primo algoritmo, ma con il sistema usato dal secondo algoritmo. A guardare la documentazione delle classi utilizzate da quest'ultimo parrebbe di no.. ma mi affido a voi.

Ovviamente ben accette segnalazioni di altre implementazioni veloci.. purchè il risultato sia una vera e propria stringa, come per la prima classe.

Grazie