我喜欢 Laurent S 的基本理念,即确保您在运行测试时拥有完全相同的条件。只要您不考虑安全问题,我就同意使用 md5。
由于您对每次运行都不同的元数据非常不明确,所以我很好奇并做了一个简短的测试。
zip t1 t00*png
zip t2 t00*png
现在进行一些元更改:
touch t00*.png
zip t3 t00*png
结果:
md5sum *.zip
760a4a1c52f3bc6cdd29c1fff7b94c1f t1.zip
760a4a1c52f3bc6cdd29c1fff7b94c1f t2.zip
83a8dcb9fe0d50e7b2b8012c8842005e t3.zip
这意味着 - 最后我的 zip [1] 版本确实会产生可重复的内容,只要不更改元数据。
您的更改 - 根据定义 - 不是文件内容的一部分(例如,JPEG 的 EXIF 数据 也是元数据,但是文件的一部分 - 而文件访问日期 不是)。否则你根本没有机会使用任何散列函数。
因此,如果您想要在文件内容相同但元数据(文件系统的元数据)不同的情况下获得可比较的结果,您只需调整元数据即可节省大量工作。
当您在这里进行某种单元测试时,您甚至可以使用它来验证 md5-sum 是否相同有调整元数据和不同没有。
概念证明:
touch t00*.png -d '2000-01-01T0:00'
zip t1 t00*png
touch t00*.png -d
zip t2 t00*png
touch t00*.png -d '2000-01-01T0:00'
zip t3 t00*png
结果:
md5sum *.zip
a1e713c1d91a0042b37043c83bb98d1b t1.zip
3085aa53bee69df4be783636b87ed62c t2.zip
a1e713c1d91a0042b37043c83bb98d1b t3.zip
最后但同样重要的是,您可以尝试调整 ZIP 文件中与您的测试无关的区域。由于 ZIP 似乎是一种表现良好的容器格式,我的更改的元数据以整齐的距离显示 - 强化了我的假设,即它们是每个文件的页眉/页脚:
cat t1.zip| xxd -ps -c 20 > t1.hd
cat t2.zip| xxd -ps -c 20 > t2.hd
diff t1.hd t2.hd
1c1
< 504b03041400000008000000212822aad7cacc0b
---
> 504b0304140000000800c37a574a22aad7cacc0b
3c3
< 09000370356d3870356d3875780b000104e80300
---
> 0900030df0ae580df0ae5875780b000104e80300
3432c3432
< 6082504b030414000000080000002128143698a4
---
> 6082504b0304140000000800c37a574a143698a4
3434c3434
< 555409000370356d3870356d3875780b000104e8
---
> 55540900030df0ae580df0ae5875780b000104e8
19691,19693c19691,19693
...
请注意由元数据更改引起的明显最小的差异。
[1] Linux 4.9.9-1-ARCH #1 SMP PREEMPT Thu Feb 9 19:07:09 CET 2017 x86_64 GNU/Linux, <br>
Zip 3.0 (July 5th 2008), by Info-ZIP, Compiled with gcc 5.3.0 for Unix (Linux ELF) on Jan 12 2016.