crc32c
Высокопроизводительная библиотека для вычисления контрольных сумм CRC-32C (Castagnoli). CRC-32C широко используется в системах хранения данных, сетевых протоколах и файловых системах для проверки целостности данных. Библиотека оптимизирована для использования аппаратных ускорений (таких как SSE4.2 и ARM CRC32) и предоставляет эффективные программные реализации для платформ без аппаратной поддержки.
Особенности
- использование аппаратных инструкций для вычисления CRC-32C на поддерживаемых процессорах (SSE4.2, ARMv8 CRC32);
- высокопроизводительные программные реализации для платформ без аппаратного ускорения;
- поддержка инкрементального вычисления CRC для потоковых данных;
- кроссплатформенность (x86, ARM, PowerPC, RISC-V) и поддержка различных компиляторов;
- простой API с функциями для вычисления CRC для блоков данных и потоков;
- интеграция с популярными системами сборки (CMake, Bazel, Autotools).
Основные компоненты
CRC32C предоставляет минималистичный, но мощный API для вычисления контрольных сумм, фокусируясь на производительности и простоте использования (подробнее с документацией можно ознакомиться здесь).
Базовые функции вычисления CRC
Библиотека предоставляет функции для вычисления CRC-32C как для целых блоков данных, так и для инкрементальной обработки потоков данных. Эти функции автоматически выбирают наиболее эффективную реализацию (аппаратную или программную) в зависимости от платформы.
Основные функции:
crc32c_value()— вычисление CRC-32C для заданного блока данных;crc32c_extend()— инкрементальное обновление CRC с новыми данными;crc32c_concat()— объединение CRC двух последовательных блоков данных;crc32c_zeros()— вычисление CRC для блока, состоящего из нулей (оптимизация для выравненных данных).
Аппаратные ускорения и оптимизации
CRC32C использует аппаратные инструкции процессора, когда они доступны, что позволяет достичь скорости обработки данных, близкой к пропускной способности памяти. Библиотека автоматически определяет возможности процессора во время выполнения.
Поддерживаемые аппаратные ускорения:
- Intel SSE4.2: инструкция
crc32для 8-, 16-, 32- и 64-битных данных; - ARMv8: инструкции
crc32b,crc32h,crc32w,crc32d(AArch64) иcrc32cb,crc32ch,crc32cw(AArch32); - PowerPC: инструкции
crc32на POWER8 и новее; - RISC-V: поддержка расширения Zbr для вычисления CRC.
Инкрементальное и потоковое вычисление
Для обработки больших объемов данных, которые не помещаются в память целиком, библиотека предоставляет функции для инкрементального вычисления CRC. Это позволяет обрабатывать данные по частям, например, при чтении из файла или сетевого потока.
Функции для потоковой обработки:
crc32c_init()— инициализация контекста для инкрементального вычисления;crc32c_update()— обновление контекста CRC новыми данными;crc32c_finalize()— получение финального значения CRC после обработки всех данных;- поддержка обработки данных произвольного размера и выравнивания.
Интеграция с системами ввода-вывода
CRC32C может быть легко интегрирована в системы чтения и записи данных, предоставляя удобные обёртки для потоков и файловых дескрипторов.
Возможности интеграции:
- вычисление CRC при чтении/записи файлов через стандартные файловые API;
- обёртки для потоков C++ (
std::istream,std::ostream); - интеграция с асинхронными системами ввода-вывода (например, Boost.Asio);
- поддержка вычисления CRC для memory-mapped файлов.
Инструменты командной строки
В состав библиотеки входят утилиты командной строки для вычисления CRC-32C файлов и данных, что удобно для использования в скриптах и при отладке.
Основные утилиты:
crc32c— вычисление и проверка CRC-32C для файлов;crc32c_benchmark— измерение производительности библиотеки на текущей системе;crc32c_test— запуск тестов корректности.