Різні 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.