Python tarfile 和 zipfile 为 2 个相同的文件生成具有不同 MD5 的存档

Python tarfile and zipfile producing archives with different MD5 for 2 identical files

我试图确保 2 个包含相同文件的存档产生相同的 MD5 校验和。

例如file1.txt和file2.txt的内容完全相同,唯一的区别是创建时间。但是,它们产生相同的 MD5:

>>> import md5
>>> md5.md5(open("file1.zip","rb").read()).hexdigest()
'c99e47de6046f141693b9aecdbdd2dc2'
>>> md5.md5(open("file2.zip","rb").read()).hexdigest()
'c99e47de6046f141693b9aecdbdd2dc2'

但是,当我为两个相同的文件创建 tarfile(或 zipfile)存档时,我得到了完全不同的 MD5。请注意,我以完全相同的方式为文件 1 和 2 使用 tarfile。

>>> import tarfile, md5
>>> #file 1
>>> a1 = tarfile.open('archive1.tar.gz','w:gz')
>>> a1.add("file1.txt")
>>> a1.close()
>>> md5.md5(open("archive1.zip","rb").read()).hexdigest()
'0865abb94f6fd92df990963c75519b2e'
>>> #file 2
>>> a2 = tarfile.open('archive2.tar.gz','w:gz')
>>> a2.add("file2.txt")
>>> a2.close()
>>> md5.md5(open("archive2.zip","rb").read()).hexdigest()
'cee53e271a1f457dfd5b5401d8311fcc'

知道为什么会这样吗?我猜它与导致此问题的存档中的 header 数据有关。也许档案维护了 file1 和 file2 的不同创建时间,因此具有不同的校验和。

虽然两个档案的负载可能相同,但档案的底层结构不同,压缩只会增加这些差异。

Zip和Tar都是压缩格式,都可以和压缩结合使用;通常情况下,他们是。不同的压缩算法和根本不同的底层格式结构的组合将导致不同的 MD5。

--

在这种情况下,尽管文件内容相同,但底层文件的最后修改时间和名称不同;这导致不同的 MD5。

尝试使用压缩文件:

重点:给 func writestr 一个 ZipInfo 的对象,而不是一个 str。

因为如果不是 ZipInfo 的对象,zinfo 将获得动态 date_time.

唯一的动态变量将写入 zip 文件头,因此 zip 文件 md5 将更改。