4

サーバーからダウンロードした 2 つのファイルを検証しようとしています。最初のファイルにはデータが含まれ、2 番目のファイルには MD5 ハッシュ チェックサムが含まれます。

次のように、データ ファイルから hexdigest を返す関数を作成しました。

def md5(fileName):
    """Compute md5 hash of the specified file"""
    try:
        fileHandle = open(fileName, "rb")
    except IOError:
        print ("Unable to open the file in readmode: [0]", fileName)
        return
    m5Hash = hashlib.md5()
    while True:
        data = fileHandle.read(8192)
        if not data:
            break
        m5Hash.update(data)
    fileHandle.close()
    return m5Hash.hexdigest()

以下を使用してファイルを比較します。

file = "/Volumes/Mac/dataFile.tbz"
fileHash = md5(file)

hashFile = "/Volumes/Mac/hashFile.tbz.md5"
fileHandle = open(hashFile, "rb")
fileHandleData = fileHandle.read()

if fileHash == fileHandleData:
    print ("Good")
else:
    print ("Bad")

ファイルの比較に失敗したため、 と の両方fileHashを出力しfileHandleDataて、次の結果を得ました。

[0] b'MD5 (hashFile.tbz) = b60d684ab4a2570253961c2c2ad7b14c\n'
[0] b60d684ab4a2570253961c2c2ad7b14c

上記の出力から、ハッシュ値は同一です。ハッシュ比較が失敗するのはなぜですか? 私はpythonが初めてで、python 3.2を使用しています。助言がありますか?

ありがとう。

4

4 に答える 4

1

ハッシュ値を の内容と比較していfileHandleます。MD5 (hashFile.tbz) =その部分と末尾の改行を取り除く必要があるため、次を試してください。

if fileHash == fileHandleData.rsplit(' ', 1)[-1].rstrip():
    print ("Good")
else:
    print ("Bad")

Python 3 では、バッファ API をサポートせず、文字列のみを操作することに注意してrsplit()くださいrstrip()。したがって、Fred Nurk が正しく追加したように、fileHandleData/fileHash (それぞれバイト バッファーまたは (Unicode) 文字列) をエンコード/デコードする必要もあります。

于 2011-05-02T06:16:40.317 に答える
1

これが false であるのと同じ理由で、比較は失敗します。

a = "data"
b = b"blah (blah) - data"
print(a == b)

その .md5 ファイルの形式は奇妙ですが、常にその形式である場合、テストする簡単な方法は次のようになります。

if fileHandleData.rstrip().endswith(fileHash.encode()):

fileHash を (Unicode) 文字列として持っているため、比較するにはそれをバイトにエンコードする必要があります。現在のデフォルトの文字列エンコーディングを使用するのではなく、エンコーディングを指定したい場合があります。

その正確な形式が常に期待される場合は、正規表現を使用してハッシュ値を抽出し、場合によってはファイル名を確認する方が堅牢です。

または、より柔軟に、部分文字列の存在をテストできます。

if fileHash.encode() in fileHandleData:
于 2011-05-02T06:19:31.023 に答える
0

"fileHash.strip(" \ n ")...を試してから、2つを比較してください。これで問題が解決するはずです。

于 2013-03-14T03:17:58.167 に答える
0

ハッシュ値は同一ですが、文字列は異なります。ダイジェストの 16 進値を取得する必要があり、ファイルからハッシュを解析する必要があります。それらを実行したら、それらを比較して同等性を確認できます。

于 2011-05-02T05:58:13.873 に答える