1. ホーム
  2. python

[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複

2022-07-07 03:11:23

質問

私はPythonで、ファイルの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

私のコードに何か欠けているものはありますか?

どのように解決するのですか?

あなたのエラーと、あなたのコードに欠けているものに関して。 m には定義されていない名前です。 getmd5() 関数で定義されていない名前です。

悪気はないのですが、あなたが初心者であることは分かっていますが、あなたのコードはあちこちに散らばっています。あなたの問題を1つずつ見ていきましょう :)

まず、あなたは hashlib.md5.hexdigest() メソッドを正しく使用していません。hashlib関数の説明については Python Doc ライブラリ . 提供された MD5 を返すための正しい方法 文字列 は、次のようにします。

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

しかし、ここにはもっと大きな問題があります。あなたは MD5 を ファイル名文字列 に基づいて MD5 を計算していますが、実際には、MD5 はファイル の内容 . 基本的にはファイルの内容を読み込んで、それをMD5にパイプする必要があります。次の例はあまり効率的ではありませんが、次のようなものです。

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

2番目の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, 'rb') 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チェックサムを生成する . 効率的に実現する方法をいくつか詳しく説明しています。

幸運を祈ります。