使用Python生成文件的MD5有时只能工作

问题描述 投票:2回答:1

我是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()
python md5
1个回答
0
投票

回答:

我在脚本中从我的项目中分离出代码,并将我的脚本提供的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("")

© www.soinside.com 2019 - 2024. All rights reserved.