2015-02-06 58 views
1

我有一個Android應用程序,它獲取zip文件的MD5校驗和。我用它來比較文件與服務器上的文件。我的問題是,每次我嘗試爲同一個文件生成md5時,校驗和是不同的。我在這裏發佈我的方法。你能告訴我什麼是錯的嗎?Zip文件MD5校驗和 - 每次不同

private static String fileMD5(String filePath) throws NoSuchAlgorithmException, IOException { 
     InputStream inputStream = null; 
     try { 
      inputStream = new FileInputStream(filePath); 
      byte[] buffer = new byte[1024]; 
      MessageDigest digest = MessageDigest.getInstance("MD5"); 
      int numRead = 0; 
      while (numRead != -1) { 
       numRead = inputStream.read(buffer); 
       if (numRead > 0) 
        digest.update(buffer, 0, numRead); 
      } 
      byte [] md5Bytes = digest.digest(); 
      return convertHashToString(md5Bytes); 
     } catch (Exception e) { 
      return "ERROR"; 
     } finally { 
      if (inputStream != null) { 
       try { 
        inputStream.close(); 
       } catch (Exception e) { } 
      } 
     } 
    } 

    private static String convertHashToString(byte[] md5Bytes) { 
     String returnVal = ""; 
     for (int i = 0; i < md5Bytes.length; i++) { 
      returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1); 
     } 
     return returnVal; 
    } 
+0

我沒有在代碼中看到任何東西來解釋爲什麼你會得到不同的結果。最可能的解釋是您的數據與運行不同。即使您使用相同的文件名稱指定該方法,但如果文件內容以任何方式在運行之間進行修改,您將得到不同的結果。 – 2015-02-06 18:43:20

+0

你的代碼確實看起來不錯...我會建議先檢查一下,看看你是否總是從文件中讀取相同數量的字節。 – Jamie 2015-02-06 19:11:57

+0

Okey,謝謝。我會試試:) – definera 2015-02-06 19:24:05

回答

0

我試着解決同樣的問題。我不知道如何解決它,但我知道理由:)。

原因是zip文件至少包含有關文件的時間戳信息。這就是你md5sum的改變。每個zip條目都是相同的,但是這個元數據信息更改了md5的結果。

也許你已經找到答案的其他地方。