Хэш-модуль Python с одним методом для получения двоичного дайджест-ключа

Я не хочу заново изобретать модуль, который, возможно, уже существует. Но на programiz есть прекрасный пример, объясняющий, как получить 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")

person Norfeldt    schedule 07.10.2015    source источник
comment
может иметь смысл передать функции файловый объект вместо имени файла, например, для вычисления хэшей для всех файлов в удаленном архиве .   -  person jfs    schedule 07.10.2015


Ответы (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.

person Martijn Pieters    schedule 07.10.2015
comment
Большое спасибо за ответ и оптимизацию кода - person Norfeldt; 07.10.2015