45 lines
4.4 KiB
Markdown
45 lines
4.4 KiB
Markdown
# 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), но это не включено в текущий код.
|