Gerar hash de arquivo em J2ME

Olá,

Alguém sabe alguma maneira de gerar o hash (pode ser MD5) de um arquivo qualquer em J2ME?
O java me, nao tem suporte oficial, teste uma outra opção (esta aqui) mas com a versão para J2ME, pelo que vi só gera o hash para Strings, pois o hash de arquivo sempre está retornando diferente.

Alguem sabe alguma outra maneira de fazer o hash de um arquivo?
Estou realmente precisando disso, é um tanto urgente e não sei mais que fazer :cry: :cry: :cry:

Esta implementação é confiável e trabalha tanto com Strings como arrays de bytes. Reveja o seu código.

Então, com as classes que o cara disponibilizou para J2ME ali, eu estava fazendo assim:

Em J2ME

[code]private String geraHash(FileConnection novoArquivo) throws IOException {

  FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
  InputStream leArquivo = fcup.openInputStream();
  byte[] buffer = new byte[(int)fcup.fileSize()];
  leArquivo.read(buffer);

  String hash;
  MD5 md5 = new MD5(buffer);
 
  md5.Update(buffer);

  byte[] resultado = md5.Final();
  hash = MD5.asHex(resultado);

  return hash; 

}[/code]

Na versão para J2SE (a original), para fazer o MD5 fica assim:

J2SE

private String geraHash(File novoArquivo) throws IOException { String hash; hash = MD5.asHex(MD5.getHash(novoArquivo)); return hash; }

Na classe J2ME lá não tem o método getHash().
A implementação em J2ME eu peguei de um exemplo que outro cara fez para converter text (string), e modifiquei para enviar o buffer de bytes.

Para um mesmo arquivo (somente em pasta diferente) esta retornando um valor para o hash em J2ME e outro para o em J2SE.

Exemplo:
arquivo algo.txt no cliente J2Me
f3dfe88e2b6690bd22b4a9fc6a423b3d

arquivo algo.txt no servidor J2SE
c5fd644c784d91511124cfcd2e69d7b2

No J2SE, para arquivos iguais, aonde muda somente o nome, o hash retorna igual.
No J2ME, para arquivos iguais, aonde muda somente o nome, o hash retorna diferente para cada um deles.

o que estou fazendo de errado?

BINGO.

realmente, tive que alterar uma coisa.
na criação do objeto md5, mudei a chamada do construtor da classe sem parametro, na linha 10.
Não sei porque, mas agora funcionou.

ficou assim:

[code]private String geraHash(FileConnection novoArquivo) throws IOException {

  FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
  InputStream leArquivo = fcup.openInputStream();
  byte[] buffer = new byte[(int)fcup.fileSize()];

  leArquivo.read(buffer, 0, (int) fcup.fileSize());

  String hash;
  MD5 md5 = new MD5();
  md5.Update(buffer);
  
  byte[] resultado = md5.Final();
  hash = MD5.asHex(resultado);
  return hash; 

}[/code]

Valeu do mesmo jeito boone. :smiley:

Como eu disse, esta classe é uma implementação confiável…

Não me lembro quando usei se fiz igual a você no construtor…mas lembro que acho que usei String.getBytes() em Update() sim…

[quote=boone]Como eu disse, esta classe é uma implementação confiável…

Não me lembro quando usei se fiz igual a você no construtor…mas lembro que acho que usei String.getBytes() em Update() sim…[/quote]

o problema que surgiu foi que eu preciso fazer o hash de arquivos.

mas, para arquivos um pouco maiores (1mb, 2mb) estoura o array de bytes (byte[]), pois não dá para jogar tudo de uma vez lá dentro.

Mudei para ler da seguinte forma:

[code] FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
InputStream leArquivo = fcup.openInputStream();
byte[] buffer = new byte[8192]; // = new byte[(int)fcup.fileSize()];

  String hash;
  MD5 md5 = new MD5();
  int qde = 0;
  while((qde = leArquivo.read(buffer)) > 0  ) {
     md5.Update(buffer);
  }
  //leArquivo.read(buffer, 0, (int) fcup.fileSize());

  //md5.Update(buffer);
  
  byte[] resultado = md5.Final();
  hash = MD5.asHex(resultado);[/code]

mas o hash não sai igual a implementação original em JEE.

Alguma ideia?