我有一个Java应用程序,它使用java.util.zip库压缩和解压缩文件。我所拥有的是服务器上的一个zip文件(由我的应用程序创建),客户端将他的一些文件压缩并上传到服务器,但是如果基础文件没有区别,那么我不想浪费时间上传。我认为可以计算客户端和服务器端的MD5哈希值,看看它们是否相同,但是发生的是我使用我的应用程序解压缩了zip文件,然后不更改任何底层文件,我使用我的应用程序将其重新压缩,但是新旧zip文件具有不同的MD5哈希值。是否有人知道为什么会这样,以及是否有比较两个zip文件的更好方法?谢谢。

最佳答案

我认为更糟糕的是:

两次执行相同的zip操作可能会导致两个不同的zip归档文件:

> zip some.zip some.txt
  adding: some.txt (stored 0%)
> zip other.zip some.txt
  adding: some.txt (stored 0%)
> ll
total 24
-rw-r--r--  1 cthies  staff  170 12 Dez 18:01 other.zip
-rw-r--r--  1 cthies  staff    4 12 Dez 18:01 some.txt
-rw-r--r--  1 cthies  staff  170 12 Dez 18:01 some.zip
> md5 *.zip
MD5 (other.zip) = f56d7753c5af78427274d930b9fb8c90
MD5 (some.zip) = e2f0382c4ad31871f62fb559157df8e8


查看二进制文件,您可以仅在一个地方看到差异:

> xxd some.zip > some.xxd
> xxd other.zip > other.xxd
> colordiff *.xxd
3c3
< 0000020: 6d65 2e74 7874 5554 0900 0363 33e6 4e78  me.txtUT...c3.Nx
---
> 0000020: 6d65 2e74 7874 5554 0900 0363 33e6 4e64  me.txtUT...c3.Nd


我认为(取决于zip-app本身)当前/可能会涉及系统时间。因此,在完全相同的源上进行的任何压缩操作都可以是唯一的(!),因此不能假定校验和相等。

我发现与时间无关的工具:tar,7z。 (两个命令行)
即tar和7z复制具有相等校验和(md5)的档案。

(在OSX 10.6.8上使用命令行zip实用程序进行了测试)

10-07 16:09
查看更多