2017-09-30 13 views
-1

私は大きなファイルをバイトチャンクで読み込むためにBufferedInputStreamでラップされたFileInputStreamを使用しています。大きなファイルのHmac MD5

public void MD5(BufferedInputStream in, Key pubKey) throws Exception{ 

     Mac md = Mac.getInstance("HmacMD5"); 
      md.init(pubKey); 
      byte[] contents = new byte[1024]; 
      int readSize; 
      while ((readSize = in.read(contents)) != -1) { 
       { 
        md.update(contents,0,readSize); 
       } 
       byte[] hashValue = md.doFinal(); 

      } 
} 

それは小さなファイルのための完全に正常に動作しますが、ファイルの200メガバイトのファイルの時間の非常識な量を取ります。

SHA256withRSAを使用して200MBのファイルに署名しようとしている間も、同じ方法が問題なく動作します。

具体的な理由はありますか?私はそれがmd.update()と関係があると感じています。

しかし、「署名」を使用している間も同じ機能を使用しました。

ご協力いただければ幸いです。

+0

ログを追加して、辛抱している時間を確認してください。 –

答えて

4

あなたはwhileループ内でdoFinalと呼んでいます。それは正しく見えません。以下を試してみてください:

public void MD5(BufferedInputStream in, Key pubKey) throws Exception{ 
    Mac md = Mac.getInstance("HmacMD5"); 
    md.init(pubKey); 
    byte[] contents = new byte[1024]; 
    int readSize; 
    while ((readSize = in.read(contents)) != -1) { 
     md.update(contents, 0, readSize); 
    } 
    byte[] hashValue = md.doFinal(); 
} 
+0

彼はもっと大きなバッファ、例えば8kか32kを使うこともうまくいくでしょう。 – EJP

関連する問題