Salve Salve
seguinte pessoal, estou usando um banco de dados oracle e preciso fazer um rotina interna utilizando java do proprio banco de dados para obter um hash de um arquivo...
por que o java? pq o oracle só gera hash de arquivo menores, e eu preciso hash de qualquer arquivo de qualquer tamanho de qualquer extensão...
então a ideia é gerar um hash md5 de um arquivo para procurar pelo hash e nao pela comparação bit a bit
A maquina virtual JAVA dentro do banco de dados, é muito durona, não são todas as bibliotecas que ela aceita.... então isso ferra a vida.... tendo que recorrer a recursos mais primitivos
O HASH será de um arquivo CLOB do banco de dados, e a função tem que devolver a string hexadecimal do hash
tentei fazer assim, mas o hash tá vindo errado nao sei o que pode ser
da um parecer ai pessoal!....
import com.sun.org.apache.xalan.internal.xsltc.dom.BitArray;
import java.sql.SQLException;
import oracle.sql.CLOB;
import java.io.*;
import java.lang.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Gen {
public static String MD5(Object key) throws NoSuchAlgorithmException, SQLException {
if (key == null) {
return null;
}
if (key instanceof CLOB) {
CLOB clob = (CLOB) key;
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] md5sum = new byte[32];
String md5hex = null;
try {
InputStream is = clob.getAsciiStream();
byte[] buffer = new byte[4096];
OutputStream outputStream = new ByteArrayOutputStream();
while (true) {
int read = is.read(buffer);
if (read == -1) {
break;
}
outputStream.write(buffer, 0, read);
digest.update(buffer, 0, read);
}
outputStream.close();
is.close();
md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
md5hex = bigInt.toString(16);
return md5hex.substring(0, 31);
} catch (java.io.IOException io_ex) {
io_ex.printStackTrace();
}
catch (java.sql.SQLException sql_ex) {
sql_ex.printStackTrace();
}
return md5hex.substring(0, 31);
} else {
return null;
}
}
}