当前位置: 首页 > 知识库问答 >
问题:

Python tarfile和zipfile使用不同的MD5为两个相同的文件生成归档

酆光熙
2023-03-14

我试图确保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。

>>> 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 的不同创建时间,从而保持不同的校验和。

共有2个答案

丘学海
2023-03-14

虽然两个档案的有效载荷可能相同,但档案的基本结构不同,压缩只会增加这些差异。

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

--

在这种情况下,基础文件的最后修改时间和名称是不同的,即使文件的内容是相同的;这会导致不同的MD5。

上官凯歌
2023-03-14

尝试使用zipfile:

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

 类似资料:
  • 问题内容: 我可以跑: 而事实证明,并且有不同的MD5哈希值。的确,它们是不同的,这证实了这一点。 我还需要传递其他哪些标志,以便其输出随时间推移与相同输入保持一致? 问题答案: 相当于 文件不同的原因是因为将其输入文件名和修改时间放入了压缩文件中。当输入是管道时,它将使用空字符串作为文件名,并使用当前时间作为修改时间。 但是它也有一个选项,告诉它不要将名称和时间戳记放入文件中。因此,如果您显式编

  • 我有两个文件命名为文章和类别。我使用SEO URL结构生成了一个URL格式。样品: 实例com/文章标题 实例com/类别标题 代码: 但有一个问题。我不能同时使用两种url格式。htaccess文件。他看到第一行,但忽略了另一行。但是我想对这两个文件使用相同的格式。你能帮忙吗?

  • 其中一个测试通过,另一个给出以下错误: java.lang.ClassCastException:类org.springframework.http.ResponseEntity不能强制转换为类org.junit.jupiter.api.function.executable(org.springframework.http.ResponseEntity和org.junit.jupiter.api

  • 我在xml文件中使用了约束布局。我有一个类似例子中的视图。Imageview和textview。我希望这两个在点击后有相同的动作。怎么才能把两者组合在一起,给他们一个id? xml:

  • 我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I

  • 我试图打开两个实例ChromeDriver具有相同的配置文件如下: 问题是第一个驱动程序工作并导航到Google,但在第二个驱动程序中,我在实例化第二个驱动程序时遇到以下异常: 附加信息:抛出了一个带有空响应的异常,该异常向远程WebDriver服务器发送HTTP请求以获取URLhttp://localhost:6949/session.异常的状态为ReceiveFailure,消息为:基础连接已