[Resolvido] Gerar um hash de um ficheiro de 1GB

2 respostas
P

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,

2 Respostas

A

Fiz algo parecido. Usava MD5 na época. Mas o conceito é o mesmo.
Em vez de gerar um Hash de todo documento eu gerava varios hashs por partes do documento.
Quando tinha esse numero X de Hash eu gerava um unico.

KamikazeBr

Use o método )]update para cada parte, e o digest para finalizar.

Segue um exemplo:

SHA1Stream.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA1Stream {

	private MessageDigest	digest;

	public SHA1Stream() throws NoSuchAlgorithmException {
		digest = MessageDigest.getInstance("SHA1");
	}

	public void update(String piece) {
		digest.update(piece.getBytes());
	}

	public String digest() {
		return new String(digest.digest());
	}

	/**
	 * @param args
	 * @throws NoSuchAlgorithmException 
	 */
	public static void main(String[] args) throws NoSuchAlgorithmException {
		String[] a = new String[] { "Kam", "i", "ka", "ze" };

		SHA1Stream sha1Stream = new SHA1Stream();

		for (String piece : a) {
			sha1Stream.update(piece);
		}
		String digest = sha1Stream.digest();
		
		System.out.println(digest);
	}
}
Criado 28 de janeiro de 2011
Ultima resposta 28 de jan. de 2011
Respostas 2
Participantes 3