4

我正在尝试验证从服务器下载的两个文件。第一个包含数据,第二个文件包含 MD5 哈希校验和。

我创建了一个从数据文件返回十六进制摘要的函数,如下所示:

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")

文件比较失败,所以我打印了两者fileHashfileHandleData我得到以下信息:

[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 中,rsplit()rstrip()支持缓冲区 API,仅对字符串进行操作。因此,正如 Fred Nurk 正确添加的那样,您还需要对 fileHandleData/fileHash(分别为字节缓冲区或(Unicode)字符串)进行编码/解码。

于 2011-05-02T06:16:40.317 回答
1

比较失败的原因相同,这是错误的:

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

哈希值相同,但字符串不同。您需要获取摘要的十六进制值,并且需要从文件中解析出哈希值。一旦你完成了这些,你就可以比较它们是否相等。

于 2011-05-02T05:58:13.873 回答
0

尝试“fileHash.strip("\n")...然后比较两者。这应该可以解决问题。

于 2013-03-14T03:17:58.167 回答