2015-11-03 42 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