# 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 для вычисления контрольных сумм, фокусируясь на производительности и простоте использования (подробнее с документацией можно ознакомиться [здесь](https://github.com/google/crc32c)).

### Базовые функции вычисления 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` — запуск тестов корректности.
