Фильтр Блума
Битовая карта отвечает «точно нет» или «возможно да» — за биты вместо гигабайтов.
1class BloomFilter {2 private bits: Uint8Array3 4 constructor(private size: number, private hashCount: number) {5 this.bits = new Uint8Array(size)6 }7 8 add(item: string): void {9 for (const h of this.hashes(item)) this.bits[h] = 110 }11 12 mightContain(item: string): boolean {13 return this.hashes(item).every((h) => this.bits[h] === 1)14 }15 16 // «точно нет» надёжно; «может быть» — с вероятностью ложного срабатывания17 private *hashes(item: string): Generator<number> {18 let h = 019 for (const ch of item) h = (h * 31 + ch.charCodeAt(0)) >>> 020 for (let i = 0; i < this.hashCount; i++) {21 h = (h * 31 + i) >>> 022 yield h % this.size23 }24 }25}Проблема
Битовая карта отвечает «точно нет» или «возможно да» — за биты вместо гигабайтов.
Что вы видите
Каждый ключ зажигает несколько битов; нулевой бит при проверке = точное «нет».
Как это работает
Вероятностная структура: k хешей на ключ, ложные «да» возможны, ложных «нет» не бывает. При ~10 битах на элемент и k≈7 ошибка ~1%. На порядки меньше памяти, чем хеш-таблица.
Пошаговый разбор
- 01
Добавление
k хешей зажигают k бит.
- 02
Проверка
Все биты горят — «возможно».
- 03
Гарантия
Нулевой бит = «точно нет».
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Cassandra/HBase
Проверка ключа в SSTable до обращения к диску.
Chrome
Safe Browsing-списки в фильтрах.
Кеши
Отсмотр до дорогого запроса.
Связанные алгоритмы
«Проверить миллион ключей за килобайты»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.