【问题标题】:Generating MD5 of files with Python works only sometimes使用 Python 生成文件的 MD5 仅在某些时候有效
【发布时间】:2019-04-23 01:12:51
【问题描述】:

我是 Python 新手,所以我决定制作一个小项目,从服务器下载一些文件。一切正常,我决定通过生成 MD5 并与服务器的 MD5 进行比较来检查下载文件的完整性。问题是,它并不总是有效。有时对于某些文件,它能够生成正确的 MD5,但大多数(大约 80%)生成的 MD5 与服务器的不匹配。

我尝试了许多不同的示例来生成 MD5,但所有示例都产生相同的结果。

注意:我正在读取 64kB 块中的文件,因为我的资源有限(在 Raspberry Pi 上运行脚本),所以我认为这样做是个好主意。是的,我已经尝试过一次加载所有文件——结果相同。

def md5_check(self, file_path, original_md5):
        calculated_md5 = hashlib.md5()
        with open(file_path, "rb") as file:
            while True:
                chunk = file.read(65536)  #The downloaded file will be read in 64kB chunks
                if not chunk: break
                calculated_md5.update(chunk)

        calculated_md5 = calculated_md5.hexdigest()

【问题讨论】:

  • 用于 py2.7.15 win64 的 WFM。我怀疑您的下载正在丢失数据或其他东西。你能给个minimal reproducible example吗?
  • 作为记录,我将hexdigest() 结果与md5sum 实用程序计算的结果进行比较,结果匹配。
  • 您确定下载的文件实际上已经完成下载/没有损坏吗?
  • 你的代码没问题,你确定你比较的哈希值真的正确吗?
  • 在文件上运行 md5sum 以找出它真正的 MD5 是什么。然后你就会知道哪一部分坏了——MD5代码,下载代码,还是服务器MD5。

标签: python md5


【解决方案1】:

答案:

我在一个脚本中将代码从我的项目中分离出来,并将我的脚本给出的 MD5 与 md5sum 的结果进行了比较,结果是正确的。

正如 Boann 所指出的,我检查了服务器的响应以查看服务器的 MD5 是否正确或损坏。 服务器为一个文件提供了 3 个不同的 URL,并计算了“未压缩”(原始)文件的 MD5。由于其中一个 URL 被标记为“original_file_url”,我认为它是原始文件的链接。不是。

为了帮助其他有类似问题的人,我将把我孤立的代码放在这里

import os
import urllib
import urllib.request
import hashlib

def save_file():
        requester =  urllib.request.Request("https://www.python.org/ftp/python/3.7.3/python-3.7.3.exe", headers={"User-Agent": "Mozilla/5.0"})
        arquivo = urllib.request.urlopen(requester)
        file_to_write = arquivo.read()
        file_directory = "C:\\Users\\myuser\\Documents\\python-3.7.3.exe"

        with open(file_directory, "wb") as file:
            file.write(file_to_write)
        md5_check(file_directory)

def md5_check(file_path):
        calculated_md5 = hashlib.md5()
        with open(file_path, "rb") as file:
            while True:
                chunk = file.read(65536)
                if not chunk: break
                calculated_md5.update(chunk)

        calculated_md5 = calculated_md5.hexdigest()
        print(calculated_md5)


save_file()
wait = input("")

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2020-06-01
    • 2018-12-11
    • 2018-02-19
    相关资源
    最近更新 更多