2017-09-30 75 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(); 

      } 
} 

它完美罰款的小文件,但需要瘋狂大量的時間一個文件200MB的文件。

當我嘗試使用SHA256withRSA簽名200MB文件時,相同的方法完美地正常工作。

是否有任何具體原因?我有一種感覺,它與md.update()有關。

但我在使用'Signature'時也使用了相同的功能。

任何幫助,將不勝感激。

+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