Aynı katran içeriği için farklı md5sumları


15

Aynı direkten iki katran yaratan bir test yaptım (dosyaları değişmeden kaldı) ve md5sum'larının farklı olduğunu buldum. Katranın başlığına bazı zaman damgası eklendiğini varsayıyorum, ancak geçersiz kılmanın yolunu bulamadım. İşletim sistemim Ubuntu 9.1. Herhangi bir fikir ?

Teşekkürler.


Kullandığınız tar komut satırını gösterin. Dosyalar değiştirilmedikçe herhangi bir fark olmamalıdır. Hatta touch filenamebir dosyanın değiştirilmiş zaman hangi değişiklikleri sağlama değiştirmek için yeterlidir.
sonraki duyuruya kadar duraklatıldı.

İşte komut: tar czf one.tgz ./bin; tar czf two.tgz ./bin Sonra her iki md5 de farklıdır.
xain

Bu katran değil, gzip gibi görünüyor. Bunun yerine bzip2 için j kullanırsanız, aynı md5sum değerini verir. Bir hata olabilir - Cygwin'de denedim ve aynı sağlama toplamını aldım. (Ben de Ubuntu 9.10'um var ve tıpkı sizin gibi orada farklı sonuçlar elde ediyorum.)
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


13

Dennis'in de işaret ettiği gibi, bu gzip. Gzip üstbilgisinin bir kısmı, dosyada sıkıştırılanlar için mod zamanıdır. Gzip'e ihtiyacınız varsa tarfile, tar'ın dahili gzip'ini kullanmak yerine katranın dışında bir adım olarak sıkıştırabilirsiniz. Gzip komutunda, değişiklik zamanının kaydedilmesini engellemek için bir bayrak bulunur.

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

Bu, tarfile içindeki süreleri etkilemez, sadece gzip başlığındaki süreyi etkilemez.


4
Tar gibi gzip seçeneklerini de geçmek mümkünGZIP=-n tar -cz ...
oseiskar

6

Tutarlı bir sağlama toplamı içeren bir tar dosyası oluşturmak için şu şekilde başlamanız yeterlidir GZIP=-n:

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

Bu nasıl çalışır: Tar, GZIPyukarıdaki gibi geçici bir ortam değişkeni kullanarak gzip seçeneklerini kabul edebilir . Valter'in dediği gibi, tar, varsayılan olarak arşive bir zaman damgası koyan gzip kullanır. Bu, aynı dosyaları sıkıştırdığınızda farklı bir sağlama toplamı alacağınız anlamına gelir. Bu -nseçenek zaman damgasını devre dışı bırakır.


4

Ben de bu sorunu yaşadım, gzip'in zaman damgasını değiştirmemesi için gzip -n

-n, --no-name orijinal adı ve zaman damgasını kaydetmez veya geri yüklemez

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

Misal:

[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

Diğer cevaplar bana başarısız olduktan sonra bir tavşan deliğine indim ve tar sürümümün (openSUSE 42.3 OSS repo'dan 1.27.1) paxvarsayılan olarak deterministik olmayan arşiv formatını kullandığını anladım, bu bile aynı dosyalardan tar ile oluşturulan arşivler sıkıştırılmadan (ve mtime'ı açıkça ayarlayarak) farklı olabilir:

$ 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

Sıkıştırma kullanılmamasına rağmen yukarıdaki çıkışın farklı olduğuna dikkat edin ; sıkıştırılmamış arşiv içeriği (tar aynı içerik üzerinde iki kez çalıştırılarak oluşturulur) farklıdır, bu nedenle sıkıştırılmış içerik GZIP=-ndiğer cevapların önerdiği gibi kullanıldığında bile farklılık gösterir

Bunu aşmak için şunları belirtebilirsiniz --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

Bu, yukarıdaki gzip ile ilgili öneriyle çalışır:

# 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

Bununla birlikte, gzip'e daha iyi sıkıştırma formatlarını tercih etmenin geçerli nedenlerine ek olarak , bunun yerine xz kullanmayı da düşünebilirsiniz (bu katran, yerine bunun yerine --xzveya -Jbayraklarıyla da desteklenir -z), çünkü burada size bir adım kazandırır; varsayılan davranışı xz, sıkıştırılmamış içerikler aynı olduğunda aynı sıkıştırılmış çıktıyı oluşturmaktır, bu nedenle aşağıdaki gibi bir seçenek belirtmenize gerek yoktur 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.