У самого хэша будет метод hexdigest
, который даст желаемый результат. Но код, который вы опубликовали, похоже, пытается применить метод к возвращаемому значению file.read()
, а не к объекту дайджеста. Я предполагаю, что вы, вероятно, имеете в виду что-то вроде
sha = hashlib.sha1()
buffer = file.read(sha.digest_size)
sha.update(buffer)
gesture = sha.hexdigest()
Попытка использовать размер дайджеста для указания количества байтов для чтения также является подозрительной. Обычно вы должны прочитать весь файл независимо от его размера; digest.size
- это длина вывода из алгоритма SHA1, а не его ввода.
Более обычный способ сделать это будет
with open(filename, 'rb') as f:
sha = hashlib(f.read())
gesture = sha.hexdigest()
Если ваша цель - прочитать двоичное представление хэша SHA1 обратно в память, hashlib
не поддерживает это напрямую. Хеш-алгоритмы, как правило, предназначены для того, чтобы сделать невозможным или, по крайней мере, чрезвычайно ресурсоемким восстановление исходного объекта только из дайджеста; но, конечно, если вы сохраните объект hashlib
с pickle
или аналогичным, вы сможете прочитать его обратно и в основном продолжить с того места, на котором остановились (хотя я считаю, что могут быть проблемы с переносом солений между некоторыми версиями Python ).
Если вам нужно шестнадцатеричное представление последовательности байтов, это Как правильно преобразовать байты в шестнадцатеричную строку в Python 3?
with open(filename, 'rb') as f:
buffer = f.read()
hexbytes = buffer.hex()