Oli*_*ier 2 compression tar gzip checksum
我确实认为以下命令等效,但它们产生不同的校验和:
tar -cvzf ...
并且tar -cvf ...; gzip ...
不会产生相同的输出。
sha1sum
不同。
会是什么gzip
,将完全匹配的命令tar -cvzf
的行为吗?
输出文件的差异可能不是由于压缩方法造成的。默认情况下,GNU tar 使用标准的 GZIP压缩模式。差异的原因之一是 GZIP 压缩文件的格式。
GZIP头的前8个字节的结构如下
OFFSET SIZE VALUE COMMENT
0 1 0x1F First "magic" id
1 1 0x8B Second "magic" id
2 1 CM Compression method
3 1 FLAGS 8-bit flag register
4 4 MTIME Object modification time
Run Code Online (Sandbox Code Playgroud)
问题出在MTIME
球场上。对于来自管道的数据,这是当前 Unix 时间的值(自 1970 年 1 月 1 日以来的秒数)。因此,以至少一秒的间隔创建的两个其他相同的压缩档案将是不同的。
尝试对tar -cvzf
相同数据运行两次并比较结果。结果将在第 5 个字节(时间戳值的最低字节)有所不同。
$ tar czvf test1.tgz tmp/ ; sleep 2 ; \
tar czvf test2.tgz tmp/ ; md5sum test1.tgz test2.tgz
tmp/
tmp/test
tmp/
tmp/test
23d46f62dd4a9a0851279df7fe15842e test1.tgz
c8ae65026a5f771c63acf87a18f7379c test2.tgz
Run Code Online (Sandbox Code Playgroud)