gzip을 사용할 때 내용은 같지만 md5sum이 다른 파일은 무엇입니까?


16

왜 이런 일이 발생하는지 모르겠지만 일부 파일을 업로드 Amazon S3한 다음 전송 된 파일을 삭제하여 md5sumAmazon 및 로컬에서 파일을 확인 합니다. 그러나 최근에 동일한 콘텐츠에 대한이 문제가 두 가지 다른 것을 생성한다는 것을 알았습니다.md5sum

[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

왜 그런 일이 일어나고 있는지 아는 사람이 있습니까? 또는 파일이 일관성 있고 신뢰할 수 있는지 어떻게 확인해야합니까?

응답 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

그것은 같은 문제 Tiago를 제공합니다.

답변:


54

RFC 1952 에 따르면 , gzip파일 헤더는 원본 파일 (필드 ) 의 수정 시간 을 포함한다 MTIME. 다음을 사용하여 헤더를 일반 텍스트 1) 로 표시 할 수 있습니다 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

따라서 gzip 파일을 실제로 비교하려면 -n옵션으로 압축 하여 원래 파일 이름과 타임 스탬프를 저장하지 마십시오 .

gzip -n renew.log s3/renew.log 

md5sum은 동일해야합니다.

그렇지 않으면 사용할 수 있습니다

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

압축 해제 된 파일의 md5sum을 계산합니다.


1) 그러나 표시된 시간과 날짜는 헤더에서 가져 오는 것이 아니라 현재 값을 나타냅니다. 파일 이름의 경우도 마찬가지입니다.

$ 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

동일한 파일의 압축 버전이 동일한 이유는 무엇입니까? 압축 프로그램 (gzip)은 헤더에 타임 스탬프를 포함하거나 임의의 알고리즘을 사용할 수 있습니다.

그리고 정확히! gzip 헤더 에는 타임 스탬프가 포함 됩니다. 압축 파일을 동일하게하려면 파일의 타임 스탬프가 동일해야합니다!

따라서 파일을 복사 할 때 항상 그렇게하지 cp -p file1 file1말고 cp file1 file2실제로는 나쁜 습관입니다!


10

'-n'플래그와 함께 gzip을 사용하십시오.

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

출처 : /unix/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum


내 대답 Tiago를 업데이트합니다. 일반적으로 문제는 동일합니다.
Valter Silva

2
'-n'플래그와 함께 사용
Tiago Cruz

2
-1,이 답변은 코멘트 (또는 세 개)이어야합니다.
그 브라질 가이

@ ruda.almeida 이것은 테스트 방법을 보여주고 문제를 해결하려고 시도 할 때 충분한 대답입니다.
제임스 메르 츠

2
좋아, "-n '과 함께 gzip 사용"이전의 모든 것은 질문을 명확하게하기 위해 주석을 작성해야합니다. 그리고 두 번째 부분은 기술적으로 정확하지만 문제의 원인이나 제안 된 제안으로 문제를 해결하는 이유를 설명하지 않기 때문에 품질이 낮은 답변입니다.
그 브라질 사람
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.