我正在尝试为给定文件生成哈希,在这种情况下,哈希函数到达了二进制文件(.tgz文件),然后生成了错误。有什么办法可以读取二进制文件并为其生成md5哈希?
我收到的错误是:
buffer = buffer.decode('UTF-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 10: invalid start byte
源代码为:
import hashlib
def HashFile(filename, readBlockSize = 4096):
hash = hashlib.md5()
with open(filename, 'rb') as fileHandle:
while True:
buffer = fileHandle.read(readBlockSize)
if not buffer:
break
buffer = buffer.decode('UTF-8')
hash.update(hashlib.md5(buffer).hexdigest())
return
我正在Linux上使用Python 3.7。
答案 0 :(得分:1)
您可以在此处进行一些调整。
您不需要解码.read()
返回的字节,因为md5()
首先是bytes
,而不是str
:
>>> import hashlib
>>> h = hashlib.md5(open('dump.rdb', 'rb').read()).hexdigest()
>>> h
'9a7bf9d3fd725e8b26eee3c31025b18e'
这意味着您可以从函数中删除行buffer = buffer.decode('UTF-8')
。
如果要使用该函数的结果,则还需要return hash
。
最后,您需要将原始字节块传递到.update()
,而不是其十六进制摘要(这是str
);请参阅文档的example。
将它们放在一起:
def hash_file(filename: str, blocksize: int = 4096) -> str:
hsh = hashlib.md5()
with open(filename, "rb") as f:
while True:
buf = f.read(blocksize)
if not buf:
break
hsh.update(buf)
return hsh.hexdigest()
(以上是使用Redis .rdb转储二进制文件的示例。)