2022-06-02 04:18:00 UTC

Blake3

Введение

В приложении Hash Calculator, начиная с версии 5.2, появилась поддержка вычисления хэша blake3. Blake3 одна из самых (если не самая) быстрых общедоступных хэш функций, при этом она безопаснее того же md5 или sha1 и обеспечивает надёжность на уровне SHA-3. Теперь приложение поддерживает ровно 50 хэш функций.

Производительность

Для примера, вычислим разные хэши одного и того же большого файла. Перед замерами вычисление было сделано несколько раз, чтобы прогреть кэш файловой системы и по максимуму исключить влияние холодного старта. Файл находится на SSD диске и RAM (128 Гб) достаточно чтобы его закэшировать целиком. Результаты получились следующие:

D:\>hc blake3 file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 11.223 sec | 64DB2334259B58133399863B19B159D22A5F8282C75C578D0FF64DCF0817847F

D:\>hc crc32c file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 8.893 sec | 67AD9CDE

D:\>hc crc32 file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 13.487 sec | 62BE9852

D:\>hc md5 file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 31.105 sec | 867C57875FF70EFC8010461D9A459CDD

D:\>hc sha1 file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 23.977 sec | 925576C8FCD7AAB87B9204F82A81D4EBE6E99D86

D:\>hc sha256 file -s D:\big_file.xml -t
D:\big_file.xml | 21.91 Gb (23523125604 bytes) | 44.507 sec | 35879DEBDACE36EEF91D635A74093C9D3AE6D19162DA0BB18D2CE871519C888A

Немного комментариев. Быстрее blake3 оказалось только вычисление crc32c, и этому есть простое объяснение — данное вычисление делается с помощью встроенных в процессоры Intel инструкций, специально предназначенных для этой хэш-суммы. Фактически, тут идет просто замер скорости чтения файла из кэша в памяти.

Но это еще не все — реализация алгоритма, допускает его распараллеливание на несколько процессоров. В blake3 поток разбивается на блоки по 1 КБ и каждый кусок хешируется независимо. Большой хеш формируется на основе хешей частей, основанных на бинарном дереве Меркла.

Такое разделение позволяет решить задачу распараллеливания обработки данных. при вычислении хеша; например, вы можете использовать 4-проводные инструкции SIMD для одновременного вычисления 4-блочных хэшей. Традиционные хеш-функции SHA-* обрабатывают данные последовательно.

Реализация blake3 на Rust использует это. Если взять утилиту b3sum и вычислить хэш того же самого файла — это будет еще быстрее:

D:\>cmd /v:on /c "echo !time! & b3sum D:\big_file.xml & echo !time!"
18:10:03,51
64db2334259b58133399863b19b159d22a5f8282c75c578d0ff64dcf0817847f  D:/big_file.xml
18:10:06,89

Получилось чуть больше трех секунд, что более чем в 3 раза быстрее, в сравнении с однопоточной реализацией.

Выводы

В случае, если нужна надежная и быстрая функция для проверки целостности или уникальности файлов, аутентификации сообщений и генерации данных для криптографических цифровых подписей — сейчас blake3 самый подходящий кандидат — и быстрая и надежная, но ни в коем случае не стоит ее (как впрочем и другие из этого сравнения) использовать для хеширования паролей, для этого имеются другие, более медленные функции, например: yescrypt, bcrypt, scrypt или Argon2.