Вычисление хеша файла
В этом примере посмотрим, как посчитать хеш файла на Python. Используем алгоритм SHA-1 из стандартного модуля hashlib и читаем файл небольшими кусками, чтобы не загружать всю память сразу.
Что нужно знать
Перед изучением примера полезно понимать:
Функции в Python — функции в Python
Пользовательские функции в Python — пользовательские функции
Работа с файлами Python — работа с файлами
Примечание
Хеш-функция принимает на вход данные произвольной длины и возвращает строку битов фиксированной длины — её называют дайджестом. Хеши массово применяются в криптографии для проверки подлинности и целостности данных. Существует много алгоритмов хеширования — MD5, SHA-1 и другие.
В этом примере используется SHA-1 — его дайджест имеет длину 160 бит.
Совет
Файл читается не целиком, а блоками: большие файлы могут не поместиться в память. Чтение по кусочкам делает программу экономной по памяти.
Пример. Хеш SHA-1 для файла
# Python program to find the SHA-1 message digest of a file
# importing the hashlib module
import hashlib
def hash_file(filepath):
""""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(filepath,'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") # Use path of the file
print(message)
Вывод
633d7356947eec543c50b76a1852f92427f4dca9
Файл открывается в бинарном режиме ('rb'). Цикл while крутится до самого конца файла — признаком конца служит пустой объект b''.
На каждой итерации считываем из файла 1024 байта (значение можно менять под свои нужды) и подкармливаем эти байты хеш-объекту через update().
В конце возвращаем строковое (шестнадцатеричное) представление дайджеста методом hexdigest().