Python 3.7:哈希二进制文件

问题描述 投票:1回答:1

我正在尝试为给定文件生成哈希,在这种情况下,哈希函数得到二进制文件(.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。

python python-3.x hash hashlib
1个回答
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转储二进制文件的示例。)

© www.soinside.com 2019 - 2024. All rights reserved.