Oi,
Eu gostava de criar um método que conseguisse ler do disco um ficheiro de 1GB e dele gerasse um SHA-1 hash.
O problema que estou a ter, é que ao carregar em memória o ficheiro, obtenho um erro de
java.lang.OutOfMemoryError: Java heap space
Qual é a melhor formar de conseguir gerar um único hash de um ficheiro de 1GB?
O código é
// data - é o array com 1GB de tamanho. O que não pode ser.
public String generateHash(byte[] data) {
MessageDigest md = null;
StringBuffer buf = new StringBuffer();
try {
md = MessageDigest.getInstance("SHA-1");
// hash it
byte[] sha1hash = new byte[40];
md.update(data, 0, data.length);
sha1hash = md.digest();
// convert hash to HEX
for (int i = 0; i < sha1hash.length; i++) {
int halfbyte = (sha1hash[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = sha1hash[i] & 0x0F;
} while(two_halfs++ < 1);
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buf.toString();
}
Obrigado,