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