我使用 php 创建了数百个文件夹和文本文件,然后将它们添加到 zip 存档中。
这一切都很好,但如果我使用相同的文件夹和文件创建另一个 zip 存档,新存档将具有与第一个不同的哈希。如果我使用 winrar 而不是 php 创建存档,这也是一样的。
当我压缩通过 php 创建的文件时,它似乎只显示不同的哈希值,但它们打开得很好。
非常奇怪,有人对此有所了解吗?
谢谢
Zip 不是确定性的。为了解决这个 zip 问题(例如,当您有 CI 并且需要更新 AWS lambda 并且不想每次都更新它时,这确实是个问题,但只有在真正改变了某些东西时)我使用了这篇文章:https:// medium.com/@pat_wilson/building-deterministic-zip-files-with-built-in-commands-741275116a19
像这样:
find . -exec touch -t "$(git ls-files -z . | \
xargs -0 -n1 -I{} -- git log -1 --date=format:"%Y%m%d%H%M" --format="%ad" '{}' | \
sort -r | head -n 1)" '{}' +
zip -rq -D -X -9 -A --compression-method deflate dest.zip sources...
文件肯定有一些差异。如果长度不完全相同,则哈希将不同。您可以使用比较十六进制编辑器(例如 Hex Workshop)来查看到底有什么区别。
我想到的可能性:
您可以考虑使用确定性_zip 它解决了这个问题,从它的文档:
构建确定性 zip 的三个技巧:
文件必须以相同的顺序添加到 zip。目录迭代顺序可能因机器而异,从而导致不同的 zip。确定性_zip 在将所有文件添加到 zip 存档之前对其进行排序。zip 中的文件必须具有一致的时间戳。如果我将目录共享到另一台计算机,则各个文件的时间戳可能会有所不同,尽管它们具有相同的内容。为了实现时间戳的一致性,deterministic_zip 将所有添加文件的时间戳设置为 2019-01-01 00:00:00。
zip 中的文件必须具有一致的权限。文件权限看起来像 -rw-r--r-- 对于所有用户都可以读取的文件,并且只能由拥有该文件的用户写入。类似地,可执行文件可能具有如下所示的权限:-rwxr-xr-x 或 -rwx------。deterministic_zip 将添加到存档的所有文件的权限设置为 -r--r--r-- 或 -r-xr-xr-x。后者仅在运行确定性_zip 的用户对文件具有执行访问权限时使用。
注意:deterministic_zip 不会修改或更新它添加到档案中的任何文件的时间戳。上面使用的技术仅适用于确定性压缩文件中创建的文件副本。