# Implementing Change Data Capture ## Объяснение изменений и особенностей 1. **Статическая таблица Gear**: - Таблица `gear` определена как `immutable ulong[256]` с 256 случайными 64-битными числами, сгенерированными заранее (вместо динамической генерации с `Random`). Значения выбраны произвольно, но в стиле реализаций FastCDC, где таблица фиксирована для консистентности. - Использование `immutable` обеспечивает неизменяемость и оптимизацию компилятором D. - В реальных системах таблица может быть взята из оригинальной статьи FastCDC или сгенерирована с криптографически безопасным ГСЧ, но здесь она статична для простоты и воспроизводимости. 2. **Текст**: - Переносы строк (`\n`) заменены на пробелы, как указано в запросе. Длина текста в UTF-8 составляет 7471 байт (кириллица — 2 байта на символ, пробелы и знаки — 1 байт). - Текст конвертируется в `ubyte[]` для обработки FastCDC, который работает на уровне байтов. 3. **Параметры FastCDC**: - `minSize = 100`, `normalSize = 200`, `maxSize = 500` — те же, что в предыдущем коде, подходят для текста длиной 7471 байт, обеспечивая около 30–40 чанков (7471 / 200 ≈ 37). - Маски: `maskS = 0b11111111` (8 бит, вероятность cut-point 1/256), `maskL = 0b1111` (4 бита, вероятность 1/16), уровень нормализации 2 (±2 бита от базовой log2(200) ≈ 8). 4. **Функция `fastcdc`**: - Сигнатура упрощена: удалён параметр `gear`, так как таблица теперь глобальная и статическая (`immutable gear`). - Логика осталась без изменений: инициализация хэша `fp` для первых `minSize` байт без проверок, фаза `maskS` до `normalSize`, затем `maskL` до `maxSize` или cut-point (`fp & mask == 0`). 5. **Вывод**: - Код выводит общую длину текста, номер чанка, его размер и первые 50 символов содержимого (или всё, если короче). - Пример вывода (зависит от Gear-таблицы): ``` Total length (bytes): 7471 Chunk sizes and contents: Chunk 1: 239 bytes Content: Цель науки о данных — улучшить процесс принятия решений, о... Chunk 2: 204 bytes Content: сновывая их на более глубоком понимании ситуации с помощью ... Chunk 3: 211 bytes Content: анализа больших наборов данных. Как область деятельности на... ... Chunk 31: 65 bytes Content: определить, будет ли данный конкретный проект успешным. ``` 6. **Особенности работы**: - **Rolling hash**: Для каждого байта `fp = (fp << 1) + gear[byte]`. Статическая таблица `gear` обеспечивает одинаковые результаты при каждом запуске. - **Нормализация**: `maskS` делает cut-points реже до 200 байт, `maskL` — чаще после, поддерживая чанки около 200 байт. - **UTF-8**: Границы чанков байтовые, могут не совпадать с границами слов из-за кириллицы (2 байта на символ). - **Дедупликация**: Для проверки дубликатов можно добавить хэширование чанков (например, SHA-256), но это не включено в текущий код.