Io, per curiosità, ho voluto fare una prova veloce e buttata giù al volo per capire quanto tempo ci impiega a calcolare il MD5 di tutte le 36^5 combinazioni,
senza fare nulla in ambito multi-threading.
import java.security.MessageDigest;
public class Md5Combinations {
private static final char[] alfabeto = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};
public static void main(String[] args) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
int count = 0;
byte[] buf = new byte[5];
long t1 = System.currentTimeMillis();
for (int i1 = 0; i1 < alfabeto.length; i1++) {
for (int i2 = 0; i2 < alfabeto.length; i2++) {
for (int i3 = 0; i3 < alfabeto.length; i3++) {
for (int i4 = 0; i4 < alfabeto.length; i4++) {
for (int i5 = 0; i5 < alfabeto.length; i5++) {
buf[0] = (byte) alfabeto[i1];
buf[1] = (byte) alfabeto[i2];
buf[2] = (byte) alfabeto[i3];
buf[3] = (byte) alfabeto[i4];
buf[4] = (byte) alfabeto[i5];
md5.reset();
byte[] md5hash = md5.digest(buf);
count++;
}
}
}
}
}
long t2 = System.currentTimeMillis();
System.out.println(count + " combinazioni in " + (t2-t1) + " ms.");
} catch (Exception e) {
System.err.println(e);
}
}
}
Il risultato a me fornito è:
60466176 combinazioni in 14750 ms.
Ovvero 14 secondi e rotti per tutte le combinazioni.
C'è da tenere presente che:
a) Il codice è ovviamente
mono thread, come è evidente dal codice.
b) Lo sto provando sul notebook di ufficio che
non ha certo un processore di quelli particolarmente "svegli" (è "solo" un 2.4GHz).
Se introducessi il multi-threading per sfruttare più core (e magari su un processore molto più sveglio!), chiaramente il tempo scenderebbe abbastanza.