Python 3.7: хеширование двоичного файла - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь сгенерировать хеш для данного файла, в этом случае хеш-функция попала в двоичный файл (файл .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

Я использую Python 3.7 в Linux.

1 Ответ

1 голос
/ 10 апреля 2019

Есть несколько вещей, которые вы можете настроить здесь.

Вам не нужно декодировать байты, возвращенные .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); см. пример документа .

Собираем все вместе:

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

...