Різні md5суми для одного вмісту дьогтю


15

Я запускаю тест, створюючи два тарі з того самого режиму (його файли залишалися незмінними), і я виявив, що їхні md5sums відрізняються. Я припускаю, що в заголовку дьогтю включена деяка часова марка, але я не знайшов способу її перекрити. Моя ОС - Ubuntu 9.1. Будь-які ідеї?

Спасибі.


Покажіть командний рядок tar, який ви використовуєте. Різниці не повинно бути, якщо файли не змінюються. Навіть при touch filenameзміні модифікованого часу файлу достатньо, щоб змінити контрольну суму.
— Призупинено до подальшого повідомлення.

Ось команда: tar czf one.tgz ./bin; tar czf two.tgz ./bin. Тоді обидва md5 відрізняються.
— xain

Це не дьоготь, це здається gzip. Якщо ви використовуєте j для bzip2, він дає той самий md5sum. Це може бути помилка - я спробував це на Cygwin і отримав ту саму контрольну суму. (У мене теж є Ubuntu 9.10, і там я отримую різні результати, як і ви.)
— Призупинено до подальшого повідомлення.

Відповіді:


13

Як Денніс вказував вище, це gzip. Частина заголовка gzip - це час модифікації для того, що стискається у файлі. Якщо вам потрібен gzip, ви можете стиснути tarfile як додатковий крок поза смолою, а не використовувати внутрішній gzip tar. Команда gzip містить прапор для придушення економії цього часу модифікації.

tar -c ./bin |gzip -n >one.tgz
tar -c ./bin |gzip -n >two.tgz
md5sum one.tgz two.tgz

Це не вплине на час у tarfile, лише на той, який знаходиться у заголовку gzip.


4
Також можна пропустити параметри gzip для GZIP=-n tar -cz ...
— таргерування,

6

Щоб створити файл tar з послідовною контрольною сумою, просто додайте GZIP=-nтак:

GZIP=-n tar -zcf myOutputTarball.tar /home/luke/directoryIWantToZip

Як це працює: Tar може приймати параметри gzip, використовуючи тимчасову GZIPзмінну середовища, як вище. Як сказав Вальтер, tar використовує gzip, який за замовчуванням ставить часову позначку в архіві. Це означає, що ви отримуєте іншу контрольну суму, коли стискаєте одні і ті ж файли. -nОпція відключає цю мітку часу.


4

У мене була і ця проблема, щоб gzip не змінив часову позначку, використовуйте gzip -n

-n, --no-name не зберігають і не відновлюють початкове ім'я та штамп часу

[valter.silva@alog ~]$ gzip --help
Usage: gzip [OPTION]... [FILE]...
Compress or uncompress FILEs (by default, compress FILES in-place).

Mandatory arguments to long options are mandatory for short options too.

  -c, --stdout      write on standard output, keep original files unchanged
  -d, --decompress  decompress
  -f, --force       force overwrite of output file and compress links
  -h, --help        give this help
  -l, --list        list compressed file contents
  -L, --license     display software license
  -n, --no-name     do not save or restore the original name and time stamp
  -N, --name        save or restore the original name and time stamp
  -q, --quiet       suppress all warnings
  -r, --recursive   operate recursively on directories
  -S, --suffix=SUF  use suffix SUF on compressed files
  -t, --test        test compressed file integrity
  -v, --verbose     verbose mode
  -V, --version     display version number
  -1, --fast        compress faster
  -9, --best        compress better
    --rsyncable   Make rsync-friendly archive

With no FILE, or when FILE is -, read standard input.

Report bugs to <bug-gzip@gnu.org>.

Приклад:

[valter.silva@alog ~]$ ls
renewClaroMMSCanaisSemanal.log.gz  s3

[valter.silva@alog ~]$ gunzip renew.log.gz 
[valter.silva@alog ~]$ gunzip s3/renew.log.gz 

[valter.silva@alog ~]$ md5sum renew.log 
d41d8cd98f00b204e9800998ecf8427e  renew.log

[valter.silva@alog ~]$ md5sum s3/renew.log 
d41d8cd98f00b204e9800998ecf8427e  s3/renew.log

[valter.silva@alog ~]$ gzip -n renew.log 
[valter.silva@alog ~]$ gzip -n s3/renew.log 

[valter.silva@alog ~]$ md5sum renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  renew.log.gz

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  s3/renew.log.gz

0

Я пішов по кролячій норі після того, як інші відповіді мені не вдалися, і мені вдалося з'ясувати, що моя версія tar (1.27.1 від репорту openSUSE 42.3 OSS) використовує недетермінований paxархівний формат за замовчуванням, а це означає, що навіть без стиснення (і навіть встановлення mtime явно) архіви, створені за допомогою tar з тих самих файлів, будуть відрізнятися:

$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi

Зауважте, що вихідний результат відрізняється, навіть якщо не використовується компресія ; вміст нестисненого архіву (згенерований за допомогою тарінгу двічі на одному і тому ж вмісті) відрізняється, тому стислий вміст також відрізнятиметься навіть при використанні, GZIP=-nяк підказують інші відповіді

Щоб обійти це, ви можете вказати --format gnu :

$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi

Це працює з пропозицією про gzip вище:

# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz

# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d  test.file.tgz

Однак, крім вагомих причин віддати перевагу кращим форматам стиснення перед gzip , ви можете подумати про використання xz (який tar також підтримує з --xzабо -Jпрапорами замість -z), оскільки це економить вам крок тут; поведінка за замовчуванням xz- це генерувати той же стислий вихід, коли нестиснений вміст однаковий, тому немає необхідності вказувати такий варіант, як GZIP=-n:

$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.