【问题标题】:Zip files contain same files but have different hashes?Zip 文件包含相同的文件但具有不同的哈希值?
【发布时间】:2022-03-03 09:42:47
【问题描述】:

我使用 php 创建了数百个文件夹和文本文件,然后将它们添加到 zip 存档中。

这一切都很好,但如果我使用相同的文件夹和文件创建另一个 zip 存档,新存档将具有与第一个不同的哈希。如果我使用 winrar 而不是 php 创建存档,也是一样的。

当我压缩通过 php 创建的文件时,它似乎只显示不同的哈希值,但它们打开正常。

很奇怪,有人对此有所了解吗?

谢谢

【问题讨论】:

  • 我猜,也许是一个不同的创建时间戳,它是 zip 文件的一部分?
  • @orn 文件原封不动,我可以一个接一个地创建 2 个 zip,它会是一样的。
  • @arbme,不,他是说 created zipfile in 中可能有一个时间戳。由于您没有同时创建它们,因此它们会有所不同。
  • 我认为文件的时间戳并没有只计入内容。似乎如果您不按相同顺序添加文件,即使内容相同,您也会得到不同的哈希值。

标签: php zip md5-file


【解决方案1】:

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...

【讨论】:

  • 这正是我的用例。非常感谢!
  • 帮助很大的精彩文章
【解决方案2】:

文件中肯定存在一些差异。如果长度不完全相同,则哈希将不同。您可以使用比较十六进制编辑器(例如 Hex Workshop)来查看到底有什么区别。

我想到的可能性:

  1. 正如@orn 所说,您使用的 zip 格式中可能有一个时间戳(不确定)。
  2. 文件添加到存档的顺序可能不同(取决于您选择它们​​/构建源数组的方式)。

【讨论】:

【解决方案3】:

您可以考虑使用deterministic_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 不会修改或更新它添加到档案中的任何文件的时间戳。上面使用的技术仅适用于确定性压缩文件中创建的文件副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多