Генерация MD5 файлов с Python работает только иногда - PullRequest
2 голосов
/ 23 апреля 2019

Я новичок в Python, поэтому я решил сделать небольшой проект, который загружает некоторые файлы с сервера. Все отлично работает, я решил проверить целостность загруженных файлов, сгенерировав MD5 и сравнив с MD5 на сервере. Проблема в том, что это не всегда работает. Иногда с некоторыми файлами он может генерировать правильный MD5, но большинство (около 80%) сгенерированных MD5 не соответствуют серверным.

Я пробовал много разных примеров, которые мог найти для генерации MD5, но все они дают один и тот же результат.

Примечание: я читаю файл кусками по 64 КБ, потому что я немного ограничен в ресурсах (запускаю скрипт на 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()

1 Ответ

0 голосов
/ 23 апреля 2019

Ответ:

Я выделил код из моего проекта в сценарии и сравнил MD5, который мой сценарий дал, с результатом md5sum, где результаты правильные.

Как указал Боан, я проверил ответ сервера, чтобы убедиться, что 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("")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...