ORACLE e JAVA.... problemas no hash

9 respostas
Hade

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;
        }
    }
}

9 Respostas

KamikazeBr

Tenta isso para converter para Hex...

char[] digest = "øPHu4¦R>B¿ªÊë,".toCharArray();

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < digest.length; i++) {
			sb.append(Integer.toHexString((int) digest[i]));
		}

		System.out.println(sb.toString());
Hade

StringBuffer nao rola na maquina virtua …
esse código eh pra rodar dentro do banco de dados…

ja tentei assim!

Hade

StringBuffer roda na maquina virtual do banco de dados sim, a que nao roda é stringbuilder

tentei esse código, mas ainda continua voltando o hash errado…

import java.sql.SQLException;
import oracle.sql.CLOB;
import java.io.*;
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 output = null;
            String arquivo = "";
            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;
                    }
                    String nova = new String(buffer);
                    //arquivo = arquivo + nova;
                    outputStream.write(buffer, 0, read);
                    digest.update(nova.getBytes(), 0, nova.length());
                }
                outputStream.close();
                is.close();

                md5sum = digest.digest();
                String md5String = new String(md5sum);
                char[] md5CharArray = md5String.toCharArray();

                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < md5CharArray.length; i++) {
                    sb.append(Integer.toHexString((int) md5CharArray[i]));
                }         
                
                return sb.toString();
                
            } catch (java.io.IOException io_ex) {
                io_ex.printStackTrace();

            } catch (java.sql.SQLException sql_ex) {
                sql_ex.printStackTrace();
            }
            return "";
        } else {
            return null;
        }
    }
}

da um help ai pessoal…

Hade

pessoal…
ninguem?

KamikazeBr

Mas me diz uma coisa, como voce sabe que de fato não esta sendo feito o Hash correto??
Como foi o teste?

Hade

então, peguei um programa para testar o hash…
alias, peguei 2 programas para testar o hash…

os dois sairam o mesmo hash e o meu código saiu diferente

KamikazeBr

Fiz um teste com seu código mas modifiquei seu while e me parece que é ele que está com problema.

Hade

se puder postar para nós … será muito bom!

agora, eu testei esse while… pegando o texto… puro…

mas sabe qual o problema? esse hash é pra qualquer arquivo
qualquer um que seja! e não para arquivos texto somente

a idéia é comparar os aquivos do BD utilizando o hash md5 para não ter duplicidade!.. mandei msg privada pra ti…

M

Boa Tarde Pessoal.

Desculpem reviver o Tópico tanto tempo depois.

Mas me deparei com uma situação bem parecida e não consegui resolver.

O que preciso é gerar um hash MD5 de arquivo .txt de aproximadamente 500Mb e tem que ser pelo banco, pois o mesmo é o que gera o .txt.

Alguém conseguiu a solução?

Seria de grande ajuda.
Obrigado

Criado 3 de fevereiro de 2011
Ultima resposta 20 de out. de 2015
Respostas 9
Participantes 3