Вычисление хеша файла

В этом примере посмотрим, как посчитать хеш файла на Python. Используем алгоритм SHA-1 из стандартного модуля hashlib и читаем файл небольшими кусками, чтобы не загружать всю память сразу.

Что нужно знать

Перед изучением примера полезно понимать:

Примечание

Хеш-функция принимает на вход данные произвольной длины и возвращает строку битов фиксированной длины — её называют дайджестом. Хеши массово применяются в криптографии для проверки подлинности и целостности данных. Существует много алгоритмов хеширования — 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().