cdc/README.md

45 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 байт, обеспечивая около 3040 чанков (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), но это не включено в текущий код.