压缩文件的MD5哈希值

5

在Java中,是否可以为.zip文件生成MD5哈希值?我发现的所有示例都是针对.txt文件的。

我想知道当我们解压数据,编辑一个文件,再次压缩并查找哈希值时,它是否与原始哈希值不同?

1个回答

6
你可以为任意文件创建MD5哈希值,独立于文件类型。哈希值只是采用了任何字节流,并且根本不解释其含义。因此,你可以使用你找到的.txt文件示例并将其应用于.zip文件。
是的,即使这并不保证由于哈希冲突,编辑.zip文件中的文件很可能会更改其MD5 - 但这只是哈希的一般属性,与压缩无关。
请注意,重新压缩文件可能会更改MD5哈希值,即使内容没有更改也是如此。这是因为尽管未压缩的文件与以前相同,但压缩文件可能会因所使用的压缩算法及其参数而有所不同。
如果你想避免重新压缩时的变化MD5哈希值,则必须在未压缩的文件上运行MD5。你可以通过使用流而无需实际将文件写入磁盘来实现即时执行。ZipInputStream可以帮助你。以下是一个简单的代码示例:
    InputStream theFile = new FileInputStream("example.zip");
    ZipInputStream stream = new ZipInputStream(theFile);
    try
    {
        ZipEntry entry;
        while((entry = stream.getNextEntry()) != null)
        {
            MessageDigest md = MessageDigest.getInstance("MD5");
            DigestInputStream dis = new DigestInputStream(stream, md);
            byte[] buffer = new byte[1024];
            int read = dis.read(buffer);
            while (read > -1) {
                read = dis.read(buffer);
            }
            System.out.println(entry.getName() + ": "
                    + Arrays.toString(dis.getMessageDigest().digest()));
        }
    } finally { stream.close(); }

谢谢回复。但是我们有没有其他方法来查找 .zip 文件中的内容是否已更改? - Priya
@Priya:如果你介意我提到的更改MD5重新压缩时出现的误报,请提取文件并将MD5应用于提取的文件。然后,您将获得相同的哈希值以保证相同的内容。但是,您永远无法摆脱更改的(极不可能的)假阴性(对于不同文件的相同哈希代码)。它们只是哈希的属性,您必须接受它们。如果您无法接受,请不要使用哈希。 - mastov
@Priya:顺便说一下,“提取”并不意味着您必须将文件物理写入磁盘。您可以使用Java的zip流来实时完成这项工作。以下是一个如何使用它们的示例,只需直接将它们传递给MD5算法,而不是写入磁盘即可:http://www.thecoderscorner.com/team-blog/java-and-jvm/12-reading-a-zip-file-from-java-using-zipinputstream - mastov
感谢您的输入。我正在尝试您的解决方案。 - Priya
1
@Priya:我明白了。是的,这是不可避免的。不仅因为时间戳的问题,还因为不同的压缩算法、不同的选项或不同的文件顺序。 - mastov
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接