Контрольная сумма Md5 отличается после gunzip и gzip

797
kevbonham

Я случайно удалил горстку сжатых файлов из папки. К счастью, я распаковал их в другом месте и сейчас занимаюсь их восстановлением. У меня были контрольные суммы md5 для старых (теперь удаленных) файлов, но контрольные суммы для вновь сжатых файлов не совпадают. Дерьмо.

Но ... У меня есть еще одна папка, которая содержит аналогичные сжатые файлы из того же источника, и я, когда я, gunzipа затем сразу gzipодин из этих файлов, контрольная сумма снова отличается, что заставляет меня подозревать, что создатель файлов использовал разные параметры для gzip (если есть альтернативное объяснение, я хотел бы услышать это).

Есть ли способ идентифицировать используемые параметры gzip, чтобы я мог убедиться, что мои манипуляции не испортили содержимое файлов?

1

2 ответа на вопрос

2
xenoid

Все эти утилиты содержат некоторую метаинформацию, которая может меняться при каждом запуске, поэтому даже с одинаковыми файлами вы получаете несколько разные ZIP-файлы (и, следовательно, разные MD5). Для сравнения содержимого вы должны распаковать их.

Если вы посмотрите GZIP в Википедии, вы узнаете, что файл GZip начинается с 10-байтового заголовка, содержащего магическое число (1f 8b), номер версии и метку времени . Другими словами, каждый прогон гарантированно дает другой файл.

Это на самом деле не обязательно правда. Если вы сжали файл (на диске), проверили его контрольную сумму, снова распаковали его, снова взяли его и снова сделали контрольную сумму, вы получите соответствующие контрольные суммы (или, по крайней мере, я делаю). Отметка времени имеет оригинальный файл. Если оригинального «файла» не было на диске, то это будет текущее время. jjlin 7 лет назад 0
@jjin Правильно. Но если вы выполните очень распространенную `tar -czf some.tar.gz связку файлов`, тогда отметкой времени будет текущее время (модификация tar на лету). xenoid 7 лет назад 0
Да, это верно для случая, который вы описываете. Я просто указываю, что это не так для всех сжатых файлов. Из моего прочтения вопроса нет ничего, что бы убедительно указывало на то, что OP работает с файлами .tar.gz. На самом деле, похоже, он работает с отдельными файлами .gz. jjlin 7 лет назад 0
Итак, я полагаю, что обновленный вопрос - есть ли для меня способ повторить контрольную сумму, которая была первоначально сделана для сравнения, это просто не так, как работает контрольная сумма md5? Напомним, у меня есть еще один набор настоящих файлов, которые я мог бы имитировать. kevbonham 7 лет назад 0
Сравнение хэшей MD5 файлов GZIP чревато опасностями (и ложными негативами). Но вы можете распаковать их и сравнить MD5-хэши несжатых файлов, и они должны совпадать. xenoid 7 лет назад 0
2
jjlin

Стандартная fileутилита Unix дает вам некоторую базовую информацию о файле .gz, например:

$ file foo.gz foo.gz: gzip compressed data, was "foo", from Unix, last modified: Tue Aug 1 14:19:21 2017, max compression 

Как видите, в заголовке хранится исходное имя файла, ОС, в которой было выполнено сжатие, время модификации и уровень сжатия. Обратите внимание, что оригинальное имя файла может отличаться, если вы сделали что-то подобное gzip -c tempfile > foo.gz, и в этом случае оригинальное имя файла будет tempfile. Или он может даже не существовать, если gzip не получил оригинальное имя файла, потому что он читал из потока (например, tar czf foo.tar.gz somedir).

Таким образом, вы, вероятно, хотите получить представление о том, какие факторы могут отличаться в первую очередь. Я не знаю, насколько все это действительно важно для вас, но вы можете взглянуть на RFC 1952, который дает формат файла. Вы можете попробовать разные настройки и даже отредактировать в шестнадцатеричном виде некоторые поля, чтобы они соответствовали полям инициатора (например, для другой ОС).

Я не осознавал, что md5 тоже смотрел на заголовок, хотя, полагаю, это имеет смысл. Эти файлы имеют разное происхождение (когда они были распакованы, я связал их с помощью сценария Python, а затем разделил их). Так что в принципе мне придется воспроизвести заголовок, чтобы выстроить контрольные суммы? kevbonham 7 лет назад 0
Контрольная сумма файла обычно рассматривает его как просто поток байтов, независимо от его внутреннего формата / структуры. Таким образом, вам нужно создать новый файл, который будет бит за битом идентичен оригиналу, чтобы получить соответствующую контрольную сумму. jjlin 7 лет назад 1

Похожие вопросы