Как подсчитать общий хэш для нескольких файлов?

Рейтинг: 0Ответов: 1Опубликовано: 29.06.2023

Скрипт обрабатывает входные файлы, выделяет нужное и из него формирует "контент". Я сравниваю с сохраненным хэшем и если совпадает, то значит обработка не пострадала от изменений в ПО. Как быть если контент формируется в виде 2 файлов? Пока просто сортирую файлы ДО и склеиваю хеши ПОСЛЕ. Думаю что будет лучше просуммировать хэши 2 файлов. Подскажите варианты?

Ответы

▲ 2Принят

Берете hashlib, создаете объект хэша нужного типа, обновляете его содержимым одного файла, потом другого файла, и т.д., в конце получаете общий хэш.

import hashlib

hash = hashlib.sha256()
files = sorted(["file1.txt", "file2.txt"])

for file_name in files:
    with open(file_name, "rb") as file:
        hash.update(file.read())

print(hash.hexdigest())

Экономный по памяти вариант:

import io
import hashlib

hash = hashlib.sha256()
files = sorted(["file1.txt", "file2.txt"])

for file_name in files:
    with open(file_name, "rb") as file:
        while block := file.read(io.DEFAULT_BUFFER_SIZE):
            hash.update(block)

print(hash.hexdigest())

В идеале в хэш еще нужно добавлять имена файлов, потому что теоретически может случиться ситуация, что файл A не пустой, а файл B пустой, в какой-то момент они меняются содержимым (A становится пустым, а B получает старое содержимое A), а хэш при этом не меняется.

Но вообще лучше конечно хранить список файлов с их хешами, не слепляя все в один хэш.