文件被更改后,MD5哈希未更改

时间:2015-11-03 13:45:34

标签: java md5 md5sum

我正在创建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();
       }
   }

但是生成哈希需要太长时间,而且到目前为止还没有生成哈希。

2 个答案:

答案 0 :(得分:4)

filename.getBytes()获取文件名的字节,而不是文件内容。

我可以告诉你如何将整个文件加载到一个字节数组中,但这样做会很糟糕,因为它可能占用大量内存,因为它不需要将整个文件保存在内存中哈希计算。

相反,您应该打开一个流并获取其中的哈希值。请参阅此答案:https://stackoverflow.com/a/304350/360211

答案 1 :(得分:1)

您似乎计算文件名的MD5总和而不是文件内容。为避免这种情况,您应该做的是使用具有已知MD5总和的文件(例如,运行steamcommunity.com/id/ownid/inventory/json/570/2)并检查您的代码是否产生相同的结果。

此外,我无法帮助您注意到您的md5sum似乎是一个更好的候选人,因为它似乎实际上是在处理文件的内容。

只是验证您为不同的输入获得不同的值可能表明您已经获得了检查求和的候选者,但是检查它实际上是否使用了正确的算法。