Хэш-модуль Python с одним методом для получения двоичного ключа
Я не хочу изобретать модуль, который, возможно, уже существует. Но есть хороший пример программирования, который объясняет, как получить дайджест сообщения SHA-1.
# Python rogram to find the SHA-1 message digest of a file
# import hashlib module
import hashlib
def hash_file(filename):
""""This function returns the SHA-1 hash
of the file passed into it"""
# make a hash object
h = hashlib.sha1()
# open file for reading in binary mode
with open(filename,'rb') as file:
# loop till the end of the file
chunk = 0
while chunk != b'':
# read only 1024 bytes at a time
chunk = file.read(1024)
h.update(chunk)
# return the hex representation of digest
return h.hexdigest()
message = hash_file("track1.mp3")
print(message)
Теперь я только что создал .py
что я импортирую, но интересно, если такой метод уже существует в hashlib
модуль или другой ухоженный модуль?
Так что я мог просто пойти
import some_hashlib_module
print some_hashlib_module.get_binary_SH1_digest("File of interest")
1 ответ
Нет, в стандартной библиотеке нет готовой функции для вычисления дайджеста файлового объекта. Код, который вы показали, является лучшим способом сделать это с Python.
Вычисление хэшей файлов - это не та задача, которая возникает достаточно часто, чтобы посвятить ей функцию. Кроме того, есть много разных типов потоков, в которых вы хотите обрабатывать данные немного по-разному; например, при загрузке данных с URL-адреса может потребоваться объединить вычисление хэша с одновременной записью данных в файл. Таким образом, текущий API для обработки хэшей настолько универсален, насколько это возможно; установить хеш-объект, повторно передать ему данные, извлечь хеш-код.
Используемая вами функция может быть написана более компактно и поддерживать несколько алгоритмов хеширования:
import hashlib
def file_hash_hexhdigest(fname, hash='sha1', buffer=4096):
hash = hashlib.new(hash)
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(buffer), b""):
hash.update(chunk)
return hash.hexdigest()
Вышеуказанное совместимо как с Python 2, так и с Python 3.