Java zip文件的MD5哈希

Java zip文件的MD5哈希,java,zip,md5-file,Java,Zip,Md5 File,是否可以在java中为.zip文件生成MD5哈希?我找到的所有示例都是针对.txt文件的 我想知道当我们解压数据、编辑文件、再次解压并找到散列时,它是否会与原始文件不同?您可以为任意文件创建MD5散列,与文件类型无关。散列只接受任何字节流,根本不解释其含义。因此,您可以使用为.txt文件找到的示例,并将其应用于.zip文件 是的,在.zip中编辑文件很可能会更改.zip文件的MD5,尽管由于哈希冲突,这不能保证。但这只是散列的一般属性,和压缩无关 但是,请注意,即使内容没有更改,重新压缩文件也可

是否可以在java中为
.zip
文件生成MD5哈希?我找到的所有示例都是针对
.txt
文件的


我想知道当我们解压数据、编辑文件、再次解压并找到散列时,它是否会与原始文件不同?

您可以为任意文件创建MD5散列,与文件类型无关。散列只接受任何字节流,根本不解释其含义。因此,您可以使用为.txt文件找到的示例,并将其应用于.zip文件

是的,在.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:如果你介意我提到的更改(在重新压缩时更改了MD5)的误报,那么你必须提取文件并将MD5应用于提取的文件。然后,对于相同的内容,您将得到相同的哈希值,这是有保证的。但您永远无法消除(极不可能的)更改的错误否定(不同文件使用相同的哈希代码)。它们只是您必须接受的散列的属性。如果你不能接受,不要使用散列。@Priya:Btw.“提取”并不意味着你必须将文件物理地写入磁盘。您可以通过使用Java的zip流动态地完成这项工作。下面是一个关于如何使用它们的示例,您可以直接将它们传递给MD5算法,而不是将它们写入磁盘:@Priya:我刚刚更新了我的答案,以反映我们在评论中讨论的内容。@Priya:我明白了。是的,这是不可避免的。这不仅是因为时间戳,还因为不同的压缩算法、不同的选项或不同的文件顺序。