我正在尝试确保内部具有相同文件的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。注意我以完全相同的方式使用tarfile作为文件1和2。
>>> 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'
为什么会出现这种情况?我猜这与导致这个的归档中的标题数据有关。也许归档文件保持file1和file2的不同创建时间,因此校验和不同。
答案 0 :(得分:1)
虽然两个档案的有效载荷可能相同,但档案的基础结构不同,而压缩只会增加这些差异。
Zip和Tar都是归档格式,它们都可以与压缩结合使用;通常情况下,他们是。不同压缩算法和根本不同的底层格式结构的组合将导致不同的MD5。
-
在这种情况下,即使文件内容相同,最后修改时间和底层文件的名称也不同;这导致了不同的MD5。
答案 1 :(得分:1)
尝试使用zipfile:
关键点:给func writtr一个ZipInfo的对象,而不是str。
因为如果不是ZipInfo的对象,zinfo将获得动态date_time。
唯一的动态变量将写入zip文件头,因此zip文件md5将会改变。