我正在尝试验证从服务器下载的两个文件。第一个包含数据,第二个文件包含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。有什么建议吗?
感谢。
答案 0 :(得分: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)字符串。)
答案 1 :(得分: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:
答案 2 :(得分:0)
哈希值相同,但字符串不相同。您需要获取摘要的十六进制值,并且需要解析文件中的哈希值。完成后,你可以比较它们是否相等。
答案 3 :(得分:0)
尝试“fileHash.strip(”\ n“)...然后比较两者。这应该可以解决问题。