2012-02-17 31 views
7

Javaを使用していくつかのファイルのMD5ハッシュを生成しています。私は約1ギガバイトの合計サイズでいくつかのファイル用に1つのMD5を生成する必要があります。 は、ここに私のコードです:Javaを使用する大きなファイルのMD5を生成するのが非常に遅い

private String generateMD5(SequenceInputStream inputStream){ 
    if(inputStream==null){ 
     return null; 
    } 
    MessageDigest md; 
    try { 
     int read =0; 
     byte[] buf = new byte[2048]; 
     md = MessageDigest.getInstance("MD5"); 
     while((read = inputStream.read(buf))>0){ 
      md.update(buf,0,read); 
     } 
     byte[] hashValue = md.digest(); 
     return new String(hashValue); 
    } catch (NoSuchAlgorithmException e) { 
     return null; 
    } catch (IOException e) { 
     return null; 
    }finally{ 
     try { 
      if(inputStream!=null)inputStream.close(); 
     } catch (IOException e) { 
      // ... 
     } 
    } 

}

これは永遠に実行するようです。 これをより効率的にするにはどうすればよいですか?

+1

pssh、 'inputStream'は' finally'ブロックに 'null'となることは間違いありません。 – BalusC

+1

バッファリングされていないIOは遅く、11のニュースです。 –

答えて

18

Fast MD5ライブラリを使用します。

String hash = MD5.asHex(MD5.getHash(new File(filename))); 

が低速でもファイルI/Oが遅いことによる可能性があることに注意してください:それはMD5プロバイダを内蔵し、ハッシュを取得するのと同じくらい簡単であるJavaのよりもはるかに高速です。

11

私はNIOを使用してコードを書き換え、コードは多少以下のようなものです:私のマシン上で

private static String generateMD5(FileInputStream inputStream){ 
    if(inputStream==null){ 

     return null; 
    } 
    MessageDigest md; 
    try { 
     md = MessageDigest.getInstance("MD5"); 
     FileChannel channel = inputStream.getChannel(); 
     ByteBuffer buff = ByteBuffer.allocate(2048); 
     while(channel.read(buff) != -1) 
     { 
      buff.flip(); 
      md.update(buff); 
      buff.clear(); 
     } 
     byte[] hashValue = md.digest(); 
     return new String(hashValue); 
    } 
    catch (NoSuchAlgorithmException e) 
    { 
     return null; 
    } 
    catch (IOException e) 
    { 
     return null; 
    } 
    finally 
    { 
     try { 
      if(inputStream!=null)inputStream.close(); 
     } catch (IOException e) { 

     } 
    } 
} 

、それは大きなファイルのMD5コードを生成するために30代程度かかり、そしてもちろん私はあなたのコードをテストこの結果は、nioがプログラムのパフォーマンスを改善しないことを示しています。

次に、それぞれioとmd5の時間を取得しようとしていますが、統計では、ioの時間の約5/6がとられているため、低速ファイルioがボトルネックになっています。

@Stickyに記載されているFast MD5ライブラリを使用すると、md5コードを生成するのに15秒しかかかりませんが、その改善は目覚ましいものです。

0

速度が問題で、URLからファイルをダウンロードするときは、は同時にMD5を計算したい(つまり、ファイルを保存せずに再度開いてMD5を取得する) https://stackoverflow.com/a/11189634/1082681が役に立ちます。このスレッドではBloodwulfのコードスニペットを元にしています(ありがとう!)ちょっと拡張しています。

関連する問題