我有一个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实用程序进行了测试)