2013-06-01 55 views
41

Tôi đã tạo mã trong python để kiểm tra md5 trong một tệp và đảm bảo md5 khớp với mã md5 của tệp gốc. Dưới đây là những gì tôi đã phát triển:Làm cách nào để tính toán tổng kiểm tra md5 của một tệp bằng 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 

Nhưng bất cứ khi nào tôi chạy mã, tôi nhận được như sau:

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 

Có điều gì tôi đang mất tích trong mã của tôi?

+0

có thể trùng lặp của [Tạo MD5 checksum của một tệp?] (Http://stackoverflow.com/questions/3431825/generating-a-md5-checksum-of-a-file) – pylover

Trả lời

108

Liên quan đến lỗi của bạn và những gì còn thiếu trong mã của bạn. m là tên không được định nghĩa cho hàm getmd5(). Không có hành vi phạm tội, tôi biết bạn là người mới bắt đầu, nhưng mã của bạn là tất cả các nơi. Hãy xem xét từng vấn đề của bạn :) Trước hết, bạn không sử dụng phương thức hashlib.md5.hexdigest() một cách chính xác. Vui lòng tìm giải thích về hàm haslib Python Doc Library. Các cách chính xác để trở md5 cho cung cấp chuỗi là để làm một cái gì đó như thế này:

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

Tuy nhiên, bạn có vấn đề lớn ở đây. Bạn đang tính toán MD5 trên chuỗi tên tệp, trong đó thực tế MD5 được tính toán dựa trên tệp nội dung. Bạn sẽ cần phải đọc về cơ bản nội dung tập tin và đường ống mặc dù md5. Ví dụ tiếp theo của tôi là không phải là rất hiệu quả, nhưng một cái gì đó như thế:

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

Như bạn có thể thấy rõ MD5 thứ hai băm là hoàn toàn khác biệt so với người đầu tiên. Lý do cho điều đó là chúng tôi đang đẩy nội dung của tập tin thông qua, không chỉ tên tập tin. Một giải pháp đơn giản có thể là một cái gì đó như thế:

# 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!." 

hãy nhìn vào bài Python: Generating a MD5 checksum of a file nó giải thích trong vài chi tiết cách làm thế nào nó có thể đạt được hiệu quả.

Chúc bạn may mắn.

+0

Wow. Tôi cảm thấy rất xấu hổ. Tôi đoán tôi đã đặt sai mã cho những gì tôi đang làm và thêm rất nhiều lỗi cùng với nó. Cảm ơn bạn đã giúp đỡ. Tôi mặc dù nhiều hơn được sử dụng để hàng loạt và lua. Vì vậy, Python là cầu kỳ cho tôi. – user2344996

+10

Bạn cũng nên mở tệp ở chế độ nhị phân với mở (tên tệp, 'rb'), nếu không bạn có thể gặp sự cố khi hệ điều hành thực hiện chuyển đổi trả về dòng/chuyển dòng. Xem https://mail.python.org/pipermail/tutor/2004-January/027634.html và http://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-file ? rq = 1 – twobeers

+3

Nếu bạn đang làm việc trên một tệp nhị phân, hãy chắc chắn rằng bạn đọc nó đúng với chế độ 'b', cuối cùng tôi làm cho nó hoạt động như mong đợi với điều này: hashlib.sha512 (mở (fn, 'rb').()). hexdigest() –

Các vấn đề liên quan