Các tệp có cùng nội dung nhưng với md5sums khác nhau khi gzip'd?


16

Tôi không biết tại sao điều này xảy ra, nhưng tôi tải lên một số tệp để Amazon S3sau đó xóa các tệp đã gửi kiểm tra md5sumcả hai trong Amazon và cục bộ. Nhưng gần đây tôi thấy vấn đề này về cùng một nội dung đang tạo ra hai khác nhaumd5sum

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

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

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

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

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

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

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
6ae0e48edb68e9ed938fdfc3894f6c94  s3/renew.log.gz

Có ai biết tại sao điều đó xảy ra không? Hoặc làm thế nào để kiểm tra xem các tập tin của tôi có nhất quán, đáng tin cậy không?

cập nhật Trả lời câu trả lời của Tiago Cruz:

[valter.silva@alog ~]$ sha1sum renew.log 
da39a3ee5e6b4b0d3255bfef95601890afd80709  renew.log

[valter.silva@alog ~]$ sha1sum s3/renew.log 
da39a3ee5e6b4b0d3255bfef95601890afd80709  s3/renew.log

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

[valter.silva@alog ~]$ sha1sum renew.log.gz 
2d9111d9db71da9fe4de57fbc19c89eb0bd46470  renew.log.gz

[valter.silva@alog ~]$ sha1sum s3/renew.log.gz 
05014ca24d133f1761f9134e8dab52e6e2111010  s3/renew.log.gz

Nó đưa ra cùng một vấn đề Tiago.

Câu trả lời:


54

Theo RFC 1952 , gziptiêu đề tệp bao gồm thời gian sửa đổi của tệp gốc (trường MTIME). Bạn có thể hiển thị tiêu đề trong văn bản thuần túy 1) với gzip -lv renew.log.gz:

method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 64263ac7 Jun 21 17:59                 314                 597  52.1% renew.log

Vì vậy, nếu bạn thực sự muốn so sánh các tệp gzip'd, hãy nén chúng với -ntùy chọn, để không lưu tên tệp gốc và dấu thời gian ,

gzip -n renew.log s3/renew.log 

và md5sum của họ phải giống hệt nhau.

Nếu không bạn có thể sử dụng

md5sum <(zcat renew.log.gz) <(zcat s3/renew.log.gz)

để tính md5sum của các tệp được giải nén.


1) Tuy nhiên, thời gian và ngày hiển thị không được lấy từ tiêu đề, mà đại diện cho các giá trị hiện tại; đây cũng là trường hợp cho tên tệp:

$ gzip renew.log 
$ mv renew.log.gz foo.gz
$ gzip -lv foo.gz -------- uncompressed name is taken from current name ---v
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 6c721644 Jul 11 22:34                 580                1586  65.7% foo
$ hexdump -C foo.gz | head -n 2
00000000  1f 8b 08 08 f0 16 df 51  00 03 72 65 6e 65 77 2e  |.......Q..renew.|
00000010  6c 6f 67 00 8d 93 dd 6e  9b 30 18 86 8f 89 94 7b  |log....n.0.....{|
                                                             ^^^-------^^^^^
                                                  original filename is stored in the header

12

Tại sao bạn mong đợi phiên bản nén của cùng một tệp là giống nhau? Chương trình nén (gzip) có thể bao gồm một số dấu thời gian trong tiêu đề hoặc có thể sử dụng một số thuật toán ngẫu nhiên.

Và chính xác! Tiêu đề gzip chứa dấu thời gian . Nếu bạn muốn các tệp nén của mình giống nhau, tệp của bạn phải có cùng dấu thời gian!

Vì vậy, khi bạn sao chép một tập tin, luôn luôn làm như vậy cp -p file1 file1, không chỉ cp file1 file2- đó thực sự là một thói quen xấu!


10

Chỉ cần sử dụng gzip với cờ '-n':

tiagocruz@stark:~$ gzip -n Yippie-Ki-Yay.mp3 bla/Yippie-Ki-Yay.mp3 

tiagocruz@stark:~$ sha1sum Yippie-Ki-Yay.mp3.gz bla/Yippie-Ki-Yay.mp3.gz 
b44b21c5f414935f1ced1187bfafd989704474a5  Yippie-Ki-Yay.mp3.gz
b44b21c5f414935f1ced1187bfafd989704474a5  bla/Yippie-Ki-Yay.mp3.gz

Nguồn: /unix/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum


Tôi cập nhật câu trả lời của tôi Tiago, nói chung vấn đề là như nhau.
Valter Silva

2
Sử dụng với cờ '-n'
Tiago Cruz

2
-1, câu trả lời này phải là một nhận xét (hoặc ba)
Chàng trai người Brazil đó

@ ruda.almeida đây là một câu trả lời đủ hợp lệ vì nó cố gắng chỉ ra cách kiểm tra, và sau đó khắc phục vấn đề.
James Mertz

2
OK, mọi thứ trước khi "sử dụng gzip với '-n'" nên được đưa ra nhận xét vì nó đang cố gắng làm rõ câu hỏi, chính xác những bình luận đó là để làm gì. Và sau đó, phần thứ hai là đúng về mặt kỹ thuật, nhưng đó là một câu trả lời chất lượng thấp bởi vì nó không giải thích được nguyên nhân gây ra vấn đề cũng như lý do tại sao đề xuất được đề xuất giải quyết nó.
chàng người Brazil đó
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.