Фильтр Блума
Фильтр Блума — структура данных, которая помогает быстро проверить, может ли элемент находится в наборе данных или точно его там нет. Используется, когда проверка наличия элемента должна быть быстрой, а использование памяти минимальным.
Как работает фильтр Блума
Фильтр Блума работает как "чек-лист". Он отвечает:
- Может быть, элемент есть (иногда может ошибиться)
- Точно элемента нет
Шаги работы фильтра Блума
-
Создание битового массива:
- Создается битовый массив длины
m. - Он состоит из 0 и 1.
- Изначально массив выглядит так:
[0, 0, 0, 0, 0, 0, 0, 0]. - Каждая позиция (индекс) в этом массиве и значения (0, 1) — всё, что фильтр "запоминает".
- Создается битовый массив длины
-
Добавление элемента:
- Например,
id = 12345. - Фильтр пропускает
idчерез несколько хэш-функций.- Хэш-функция — математический алгоритм, который превращает строку ("12345") в числа (индексы массива).
- Пример:
hash_1("12345") -> 2hash_2("12345") -> 5hash_3("12345") -> 7
- Фильтр "ставит галочки" на этих позициях, т.е. устанавливает биты на этих индексах = 1:
[0, 0, 1, 0, 0, 1, 0, 1]
- Фильтр запоминает, что на позициях
[2, 5, 7]есть что-то.
- Например,
-
Проверка элемента:
- Чтобы узнать, есть ли
id = 54321в фильтре Блума:- Он снова пропускается через те же хэш-функции:
hash_1("54321") -> 1hash_2("54321") -> 3hash_3("54321") -> 6
- Фильтр смотрит на эти индексы в массиве:
[0, 0, 1, 0, 0, 1, 0, 1]. - Позиция 1 = 0 ->
id = "54321"точно не добавлялся. - Если бы добавлялся, то позиция 1 была бы = 1.
- Он снова пропускается через те же хэш-функции:
- Если все проверенные индексы равны 1, то фильтр говорит: может быть, элемент есть.
- Если хотя бы один бит на позициях, которые вычислили хэш-функции, равен 0, элемент точно отсутствует.
- Чтобы узнать, есть ли
Чего нет в фильтре Блума
- Не хранит сами данные (например, список
id). Хранит информацию в битовом массиве (создаётся в оперативной памяти RAM). Это компактное представление множества. - Не знает ничего напрямую о добавленных элементах.
- У него есть только массив битов (позиции, которые связаны с добавленными элементами) и хэш-функции (для поиска индексов).
Как выбрать параметры
Размер битового массива (m) → влияет на вероятность ложноположительных срабатываний.
Количество хэш-функций (k) → влияет на баланс между точностью и скоростью.
Чем больше m и k, тем выше точность, но больше памяти требуется. Оптимальные значения выбираются в зависимости от ожидаемого числа элементов и допустимого уровня ошибок.
Примеры применения
- В БД:
- Для ускорения поиска записей без полного сканирования таблиц.
- В индексах для предварительной проверки наличия ключа.
- В веб-приложениях для быстрой проверки, есть ли объект в кэше, без полного перебора.
- В блокировке спама для проверки, был ли email уже отправлен.
- Для уменьшения сетевых запросов (в Cassandra или Redis) для предварительной проверки наличия данных на узле. Если фильтр говорит "данных нет", система не делает запрос к этому узлу.
- В CDN (Content Delivery Network) для проверки, есть ли контент на edge-сервере.
В системах
- Google Bigtable → использует фильтр Блума для ускорения поиска данных.
- Apache Cassandra → проверяет, есть ли ключ в SSTable перед загрузкой с диска.
- Bitcoin и блокчейн → фильтрация транзакций в P2P-сетях.
Альтернативы
- Counting Bloom Filter (Фильтр Блума с подсчетом) → позволяет удалять элементы.
- Cuckoo Filter (Кукушкин фильтр) → имеет более низкую вероятность ошибок и поддерживает удаление.
- HyperLogLog → используется для подсчёта количества уникальных элементов.
Недостатки и ограничения
- Стандартный фильтр Блума не поддерживает удаление элементов (есть модификации, например, Counting Bloom Filter).
- Может ошибаться из-за коллизий хэш-функций: некоторые индексы в массиве могут пересекаться (коллизии).
- Пример:
- "12345" ставит 1 на позициях
[2, 5, 7]. - "67890" ставит 1 на позициях
[5, 7, 8]. - Фильтр может ошибочно считать, что элемент есть, хотя его нет.
- "12345" ставит 1 на позициях
- Пример:
- Не подходит, если нужна точность 100%.
- Если фильтр переполняется, ложноположительные срабатывания становятся слишком частыми.
Фильтр Блума vs. Хэш-таблица
Это структуры данных, но у них разные цели и принципы работы. Фильтр Блума не хранит данные, только информацию "возможно элемент находится в наборе". В отличие от хэш-таблицы, он не позволяет извлекать сохранённые элементы или их значения.
- Фильтр Блума используется если важна эффективность по памяти и допустимы ложноположительные ответы.
- Хэш-таблица — если нужно хранить и быстро извлекать данные.
Пример
В БД фильтр Блума помогает проверять, есть ли ключ перед загрузкой данных, а хэш-таблица хранит сами данные.
Сравнительная таблица
| Критерий | Фильтр Блума | Хэш-таблица |
|---|---|---|
| Назначение | Проверка принадлежности элемента (есть/нет) | Хранение и быстрый доступ к данным (ключ → зна чение) |
| Гарантия точности | Нет (есть ложноположительные ответы) | Да (если нет коллизий) |
| Ложноотрицательные ответы | Нет (если фильтр выдает "нет", значит точно нет) | Нет (если ключ отсутствует, значит его нет) |
| Ложноположительные ответы | Да (может сказать "да", даже если элемента нет) | Нет (если ключ найден, значит он точно есть) |
| Удаление элементов | Невозможно (в классической реализации) | Возможно (обычно O(1)) |
| Потребление памяти | Очень мало (битовый массив) | Гораздо больше (ключи + значения) |
| Время вставки/поиска | O(k), где k — число хеш-функций | O(1) в среднем, O(n) в худшем случае (коллизии) |
| Применение | Фильтрация, кеширование, базы данных | Хранение и быстрый доступ к данным |
Материалы
- Что такое фильтр Блума?
- Фильтр Блума: зачем нужен и как работает
- Что такое фильтр Блума и как он работает на практике (с примерами)
- bloom — индексный метод доступа, основанный на фильтрах Блума
- Что такое фильтр Блума в Blockchain?
- Фильтр Блума
- Фильтр Блума – вероятностная структура данных для проверки принадлежности элемента множеству
- Просто о сложном: что фильтрует фильтр Блума?
- Фильтр Блума
- Фильтр Блума с подсчётом
- Хеширование кукушки (борьба с коллизиями)
- Кукушкин фильтр
- Когда фильтр Блума не подходит
- Postgres модуль bloom (предоставляет индексный метод доступа, основанный на фильтрах Блума)
- Фильтр Блума в Apache Spark для Parquet-файлов
- Как фильтры Блума в 10 раз ускорили SQLite
- Oracle: вероятностный Bloom filter
- HyperLogLog в PostgreSQL
- Алгоритм HyperLogLog, или Оцениваем мощность множества за O(1)
- Проверка на уникальность в больших данных с HyperLogLog (Основы Redis)
- Bloom Filter Datatype for Redis (en)
- Вероятностные структуры данных и где они обитают
- Cassandra | Bloom Filters (en, документация)
- Bloom Filters by Example (en, онлайн-пример фильтра Блума)
Видео
- Хеш-таблицы, фильтр Блума
- Фильтр Блума Bloom filters | Хэширование строк String hashing
- Структура данных: фильтр Блума
- Алгоритмы для распределенных систем: Фильтр Блума, Дерево Меркла, ГСЧ на основе RSA
- Проектирование ПО - Лекция 6.2 - Bloom Filter
- Redis HyperLogLog Explained
- Алгоритмы и структуры данных 14 Открытый ключ, кукушка, фильтр Блума
- Лекция 7: Фильтры Блума (часть I)
- Идеальное хеширование, хеширование кукушки, фильтр Блума
- Хэш-таблицы за 10 минут