2013-06-01 4 views
41

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

#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 

Что мне не хватает в моем коде?

+0

Возможный дубликат [Генерация контрольной суммы MD5 файла?] (Http://stackoverflow.com/questions/3431825/generating-a-md5-checksum-of-a-file) – pylover

ответ

108

Что касается вашей ошибки и отсутствия в коде. m - это имя, которое не определено для функции getmd5(). Не обижайтесь, я знаю, что вы новичок, но ваш код повсюду. Давайте посмотрим на ваши вопросы по очереди :) Во-первых, вы не используете метод hashlib.md5.hexdigest() правильно. Пожалуйста, найдите объяснения по функциям haslib 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 orginal_md5 == md5_returned: 
    print "MD5 verified." 
else: 
    print "MD5 verification failed!." 

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

Удачи.

+0

Вау. Мне так стыдно. Думаю, я поставил неправильный код для того, что делал, и добавил много ошибок вместе с ним. Спасибо за вашу помощь. Я, скорее, больше привык к партии и lua. Так что Python придирчив для меня. – user2344996

+10

Вы также должны открыть файл в двоичном режиме с открытым (имя_файла, 'rb'), в противном случае могут возникнуть проблемы, когда os выполняет преобразования новой строки/каретки. См. Https://mail.python.org/pipermail/tutor/2004-January/027634.html и http://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-file ? rq = 1 – twobeers

+3

Если вы работаете в двоичном файле, убедитесь, что вы правильно его читаете с помощью режима «b», и, наконец, я делаю так, как ожидается, с этим: hashlib.sha512 (open (fn, 'rb').()). hexdigest() –

Смежные вопросы