Zip-файлы содержат одинаковые файлы, но имеют разные хеши?

Я создал сотни папок и текстовых файлов с помощью php, а затем добавил их в zip-архив.

Это все работает нормально, но если я создам другой zip-архив, используя те же папки и файлы, новый архив будет иметь хэш, отличный от первого. Это то же самое, если я использую winrar вместо php для создания архива.

Кажется, что когда я заархивирую созданные мной файлы через php, разные хеши отображаются, но они открываются нормально.

Очень странно, кто-нибудь пролил свет на это?

Спасибо

3 ответа

Решение

Разумеется, в файлах есть некоторые различия. Если длины не совпадают, хеш будет другим. Вы можете использовать сравнительный шестнадцатеричный редактор, например, Hex Workshop, чтобы увидеть, в чем именно заключаются различия.

Возможности, которые приходят мне в голову:

  1. Как уже упоминалось, @orn может содержать временную метку в используемом вами формате zip (не уверен).
  2. Порядок добавления файлов в архив может быть различным (в зависимости от того, как вы их выбираете / строите исходный массив).

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

Вы можете рассмотреть возможность использования deterministic_zip , он решает эту проблему из своей документации:

Есть три приема для создания детерминированного почтового индекса:

Файлы должны быть добавлены в zip в том же порядке. Порядок итерации каталога может различаться на разных машинах, что приводит к разным почтовым индексам. deterministic_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. Последний используется только тогда, когда пользователь, запускающий deterministic_zip, имеет доступ к файлу на выполнение.

Примечание: deterministic_zip не изменяет и не обновляет временные метки любых файлов, добавляемых в архивы. Методы, использованные выше, применимы только к копиям файлов в архивах, которые создает deterministic_zip.

Другие вопросы по тегам