Я хотел бы улучшить производительность хеширования больших файлов, например, размером в десятки гигабайт.
Обычно вы последовательно хешируете байты файлов, используя хэш-функцию (скажем, дляпример SHA-256, хотя я, скорее всего, буду использовать Skein, поэтому хеширование будет медленнее по сравнению со временем, которое требуется для чтения файла с [быстрого] SSD).Давайте назовем этот метод 1.
Идея состоит в том, чтобы параллельно хэшировать несколько блоков по 1 МБ файла на 8 процессорах, а затем хэшировать объединенные хэши в один финальный хеш.Давайте назовем этот метод 2.
Изображение, изображающее этот метод, выглядит следующим образом:
Я хотел бы знать, является ли эта идея обоснованнойи сколько «безопасности» теряется (с точки зрения вероятности коллизий) по сравнению с выполнением одного хэша на протяжении всего файла.
Например:
Давайте использовать SHA-256 варианта SHA-2 и установите размер файла 2 ^ 34 = 34 359 738 368 байт.Поэтому, используя простой проход (метод 1), я бы получил 256-битный хеш для всего файла.
Сравните это с:
Используя параллельное хеширование (т. Е. Метод 2).), Я бы разбил файл на 32 768 блоков по 1 МБ, хэшировал эти блоки с помощью SHA-256 на 32 768 хешей по 256 бит (32 байта), объединял хэши и делал окончательный хэш результирующего конкатенированного набора данных размером 1 048 576 байт, чтобымой последний 256-битный хеш для всего файла.
Является ли метод 2 менее безопасным, чем метод 1, с точки зрения вероятности и / или вероятности коллизий?Возможно, мне следует перефразировать этот вопрос следующим образом: облегчает ли злоумышленник метод 2 созданию файла, который хэширует то же значение хеш-функции, что и исходный файл, за исключением, разумеется, тривиального факта, что атака методом "грубой силы" будет дешевле, посколькухэш может быть рассчитан параллельно на N cpus?
Обновление : я только что обнаружил, что моя конструкция в методе 2 очень похожа на понятие списка хешей ,Однако статья в Википедии, на которую ссылается ссылка в предыдущем предложении, не содержит подробностей о превосходстве или неполноценности хэш-списка в отношении вероятности коллизий по сравнению со способом 1, простым старым хэшированием файла, когда только используется верхний хеш из списка хешей.