Подтвердить что ты не робот

Как вычислить контрольную сумму md5 файла в Python?

Я сделал код в python, который проверяет md5 в файле и гарантирует, что md5 соответствует оригиналу. Вот что я разработал:

#Defines filename
filename = "file.exe"

#Gets MD5 from file 
def getmd5(filename):
    return m.hexdigest()

md5 = dict()

for fname in filename:
    md5[fname] = getmd5(fname)

#If statement for alerting the user whether the checksum passed or failed

if md5 == '>md5 will go here<': 
    print("MD5 Checksum passed. You may now close this window")
    input ("press enter")
else:
    print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a    new copy")
    input("press enter") 
exit

Но всякий раз, когда я запускаю код, я получаю следующее:

Traceback (most recent call last):
File "C:\Users\Username\md5check.py", line 13, in <module>
 md5[fname] = getmd5(fname)
File "C:\Users\Username\md5check.py, line 9, in getmd5
  return m.hexdigest()
NameError: global name 'm' is not defined

Есть ли что-нибудь в моем коде?

4b9b3361

Ответ 1

Что касается вашей ошибки и того, что отсутствует в вашем коде. m - это имя, которое не определено для функции getmd5(). Без обид, я знаю, что вы новичок, но ваш код повсюду. Давайте рассмотрим ваши проблемы по hashlib.md5.hexdigest() :) Во-первых, вы hashlib.md5.hexdigest() используете hashlib.md5.hexdigest(). Пожалуйста, найдите объяснение функций hashlib Python Doc Library. Правильный способ вернуть MD5 для предоставленной строки - сделать что-то вроде этого:

>>> import hashlib
>>> hashlib.md5("filename.exe").hexdigest()
'2a53375ff139d9837e93a38a279d63e5'

Тем не менее, у вас есть большая проблема здесь. Вы вычисляете MD5 на строке имени файла, где в действительности MD5 рассчитывается на основе содержимого файла. Вам нужно будет в основном прочитать содержимое файла и передать его через MD5. Мой следующий пример не очень эффективен, но примерно так:

>>> import hashlib
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'

Как вы можете видеть, второй хэш MD5 полностью отличается от первого. Причина этого в том, что мы пропускаем содержимое файла, а не только имя файла. Простое решение может быть что-то вроде этого:

# Import hashlib library (md5 method is part of it)
import hashlib

# File to check
file_name = 'filename.exe'

# Correct original md5 goes here
original_md5 = '5d41402abc4b2a76b9719d911017c592'  

# Open,close, read file and calculate MD5 on its contents 
with open(file_name) as file_to_check:
    # read contents of the file
    data = file_to_check.read()    
    # pipe contents of the file through
    md5_returned = hashlib.md5(data).hexdigest()

# Finally compare original MD5 with freshly calculated
if original_md5 == md5_returned:
    print "MD5 verified."
else:
    print "MD5 verification failed!."

Пожалуйста, ознакомьтесь с публикацией Python: создание контрольной суммы MD5 для файла, в которой подробно объясняется несколько способов эффективного ее достижения.

Удачи.