4.4 KiB
4.4 KiB
Implementing Change Data Capture
Объяснение изменений и особенностей
-
Статическая таблица Gear:
- Таблица
gear
определена какimmutable ulong[256]
с 256 случайными 64-битными числами, сгенерированными заранее (вместо динамической генерации сRandom
). Значения выбраны произвольно, но в стиле реализаций FastCDC, где таблица фиксирована для консистентности. - Использование
immutable
обеспечивает неизменяемость и оптимизацию компилятором D. - В реальных системах таблица может быть взята из оригинальной статьи FastCDC или сгенерирована с криптографически безопасным ГСЧ, но здесь она статична для простоты и воспроизводимости.
- Таблица
-
Текст:
- Переносы строк (
\n
) заменены на пробелы, как указано в запросе. Длина текста в UTF-8 составляет 7471 байт (кириллица — 2 байта на символ, пробелы и знаки — 1 байт). - Текст конвертируется в
ubyte[]
для обработки FastCDC, который работает на уровне байтов.
- Переносы строк (
-
Параметры 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).
-
Функция
fastcdc
:- Сигнатура упрощена: удалён параметр
gear
, так как таблица теперь глобальная и статическая (immutable gear
). - Логика осталась без изменений: инициализация хэша
fp
для первыхminSize
байт без проверок, фазаmaskS
доnormalSize
, затемmaskL
доmaxSize
или cut-point (fp & mask == 0
).
- Сигнатура упрощена: удалён параметр
-
Вывод:
- Код выводит общую длину текста, номер чанка, его размер и первые 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: определить, будет ли данный конкретный проект успешным.
-
Особенности работы:
- Rolling hash: Для каждого байта
fp = (fp << 1) + gear[byte]
. Статическая таблицаgear
обеспечивает одинаковые результаты при каждом запуске. - Нормализация:
maskS
делает cut-points реже до 200 байт,maskL
— чаще после, поддерживая чанки около 200 байт. - UTF-8: Границы чанков байтовые, могут не совпадать с границами слов из-за кириллицы (2 байта на символ).
- Дедупликация: Для проверки дубликатов можно добавить хэширование чанков (например, SHA-256), но это не включено в текущий код.
- Rolling hash: Для каждого байта