2015-11-03 56 views
0

我創建了md5哈希生成器。我首先測試它與原始文件,然後我改變了文件,看看是否MD5哈希代碼是否改變。哈希代碼甚至在我改變同一個文件後也沒有改變。問題是什麼?文件已被更改後,MD5哈希未更改

public class MD5CheckSum { 

public byte [] createChecksum (String filename) throws Exception { 
    InputStream fis = new FileInputStream(filename); 

    byte[] buffer = new byte[1024]; 
    MessageDigest complete = MessageDigest.getInstance("MD5"); 
    int numRead; 

    do { 
     numRead = fis.read(buffer); 
     if (numRead > 0){ 
      complete.update(buffer,0,numRead); 
     } 
    }while (numRead !=1); 

    fis.close(); 
    return complete.digest(); 

} 
public String getMD5Checksum(String filename) throws Exception { 
    /*byte[] b = createChecksum(filename); 
    String result = ""; 

    for (int i=0; i < b.length; i++){ 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result;*/ 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] messageDigest = md.digest(filename.getBytes()); 
    BigInteger number = new BigInteger(1, messageDigest); 
    String hashtext = number.toString(16); 
    // Now we need to zero pad it if you actually want the full 32 chars. 
    while (hashtext.length() < 32) { 
     hashtext = "0" + hashtext; 
    } 
    return hashtext; 
} 

public MD5CheckSum() throws Exception{ 

    String path = "C:/Users/user/Downloads/Documents/ECOMM SUMMER BLOSSOM.docx"; 

    System.out.println("MD5 Hash Succeed"); 

    System.out.println(getMD5Checksum(path)); 

} 

編輯:我改變了一些代碼

public static String getMD5Checksum(String filename) throws Exception { 
     byte[] b = createChecksum(filename); 
     String result = ""; 

     for (int i=0; i < b.length; i++) { 
      result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
     } 
     return result; 
    } 

    public static void main(String args[]) { 
     try { 
      System.out.println("Start hashing...."); 
      System.out.println(getMD5Checksum("C:/Users/user/Downloads/Documents/21.pdf")); 
      System.out.println("Done hashing...."); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

但時間過長產生仍不到現在爲止所產生的散列值和當前的哈希值。

回答

4

filename.getBytes()獲取文件名的字節數,而不是文件內容。

我可以告訴你如何將整個文件加載到一個字節數組中,但這會很糟糕,因爲它可能會佔用大量的內存,因爲它不需要將整個文件保存在內存中,散列值被計算。

相反,你應該打開一個流並獲得散列。看到這個答案爲:https://stackoverflow.com/a/304350/360211

+0

可以請你看看我的編輯問題? – August

1

你似乎計算文件名的MD5和,而不是文件的內容。你應該這樣做,以避免這是使用文件與已知的MD5-總和(例如通過在其上運行md5sum),並檢查你的代碼產生同樣的結果。

我也不能不指出的是您的createCheckSum似乎是一個更好的候選人進行工作,因爲它似乎確實對文件的內容合作。

只是驗證你得到不同的輸入可能表明您已經有了一個檢查總結候選人不同的值,但它是一個貧窮的檢查,它實際上是用正確的算法。

+0

可以請你看看我的編輯問題? – August