/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/util/crc32c.cpp
53 строки
2 KB
Андрей Смычков
feat: util varint, crc32c, murmur3, compression (snappy)
25 апр 2026, 09:00
25 апр 2026, 09:00
a7cf584
Код
Авторство
О чём код?
#include "crc32c.hpp" namespace sstorage { namespace util { //============================================================================ // Таблица для CRC-32C (Castagnoli), полином 0x82F63B78 (reversed от 0x1EDC6F41) //============================================================================ // Генерируется один раз при загрузке модуля. // 256 записей, каждая — результат обработки одного байта. //============================================================================ namespace { struct Crc32cTable { uint32_t table[256]; Crc32cTable() { const uint32_t poly = 0x82F63B78; for (uint32_t i = 0; i < 256; ++i) { uint32_t crc = i; // 8 итераций — по одному биту for (int j = 0; j < 8; ++j) { crc = (crc >> 1) ^ ((crc & 1) ? poly : 0); } table[i] = crc; } } }; static const Crc32cTable kTable; } //============================================================================ // Реализация расчёта CRC-32C через таблицу //============================================================================ uint32_t crc32cExtend(uint32_t crc, const char* data, size_t len) { // Инициализация: XOR с 0xFFFFFFFF (стандартная практика) crc ^= 0xFFFFFFFF; const uint8_t* p = reinterpret_cast<const uint8_t*>(data); for (size_t i = 0; i < len; ++i) { // Table lookup: (low byte of CRC XOR input byte) -> table entry crc = (crc >> 8) ^ kTable.table[(crc ^ p[i]) & 0xFF]; } // Финализация: XOR с 0xFFFFFFFF return crc ^ 0xFFFFFFFF; } uint32_t crc32c(const char* data, size_t len) { return crc32cExtend(0, data, len); } } }