Перейти к основному содержимому

Фильтр Блума

Фильтр Блума — структура данных, которая помогает быстро проверить, может ли элемент находится в наборе данных или точно его там нет. Используется, когда проверка наличия элемента должна быть быстрой, а использование памяти минимальным.

Как работает фильтр Блума

Фильтр Блума работает как "чек-лист". Он отвечает:

  • Может быть, элемент есть (иногда может ошибиться)
  • Точно элемента нет

Шаги работы фильтра Блума

  1. Создание битового массива:

    • Создается битовый массив длины m.
    • Он состоит из 0 и 1.
    • Изначально массив выглядит так: [0, 0, 0, 0, 0, 0, 0, 0].
    • Каждая позиция (индекс) в этом массиве и значения (0, 1) — всё, что фильтр "запоминает".
  2. Добавление элемента:

    • Например, id = 12345.
    • Фильтр пропускает id через несколько хэш-функций.
      • Хэш-функция — математический алгоритм, который превращает строку ("12345") в числа (индексы массива).
      • Пример:
        • hash_1("12345") -> 2
        • hash_2("12345") -> 5
        • hash_3("12345") -> 7
    • Фильтр "ставит галочки" на этих позициях, т.е. устанавливает биты на этих индексах = 1:
      • [0, 0, 1, 0, 0, 1, 0, 1]
    • Фильтр запоминает, что на позициях [2, 5, 7] есть что-то.
  3. Проверка элемента:

    • Чтобы узнать, есть ли id = 54321 в фильтре Блума:
      • Он снова пропускается через те же хэш-функции:
        • hash_1("54321") -> 1
        • hash_2("54321") -> 3
        • hash_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].
      • Фильтр может ошибочно считать, что элемент есть, хотя его нет.
  • Не подходит, если нужна точность 100%.
  • Если фильтр переполняется, ложноположительные срабатывания становятся слишком частыми.

Фильтр Блума vs. Хэш-таблица

Это структуры данных, но у них разные цели и принципы работы. Фильтр Блума не хранит данные, только информацию "возможно элемент находится в наборе". В отличие от хэш-таблицы, он не позволяет извлекать сохранённые элементы или их значения.

  • Фильтр Блума используется если важна эффективность по памяти и допустимы ложноположительные ответы.
  • Хэш-таблица — если нужно хранить и быстро извлекать данные.

Пример

В БД фильтр Блума помогает проверять, есть ли ключ перед загрузкой данных, а хэш-таблица хранит сами данные.

Сравнительная таблица

КритерийФильтр БлумаХэш-таблица
НазначениеПроверка принадлежности элемента (есть/нет)Хранение и быстрый доступ к данным (ключ → значение)
Гарантия точностиНет (есть ложноположительные ответы)Да (если нет коллизий)
Ложноотрицательные ответыНет (если фильтр выдает "нет", значит точно нет)Нет (если ключ отсутствует, значит его нет)
Ложноположительные ответыДа (может сказать "да", даже если элемента нет)Нет (если ключ найден, значит он точно есть)
Удаление элементовНевозможно (в классической реализации)Возможно (обычно O(1))
Потребление памятиОчень мало (битовый массив)Гораздо больше (ключи + значения)
Время вставки/поискаO(k), где k — число хеш-функцийO(1) в среднем, O(n) в худшем случае (коллизии)
ПрименениеФильтрация, кеширование, базы данныхХранение и быстрый доступ к данным

Материалы

  1. Что такое фильтр Блума?
  2. Фильтр Блума: зачем нужен и как работает
  3. Что такое фильтр Блума и как он работает на практике (с примерами)
  4. bloom — индексный метод доступа, основанный на фильтрах Блума
  5. Что такое фильтр Блума в Blockchain?
  6. Фильтр Блума
  7. Фильтр Блума – вероятностная структура данных для проверки принадлежности элемента множеству
  8. Просто о сложном: что фильтрует фильтр Блума?
  9. Фильтр Блума
  10. Фильтр Блума с подсчётом
  11. Хеширование кукушки (борьба с коллизиями)
  12. Кукушкин фильтр
  13. Когда фильтр Блума не подходит
  14. Postgres модуль bloom (предоставляет индексный метод доступа, основанный на фильтрах Блума)
  15. Фильтр Блума в Apache Spark для Parquet-файлов
  16. Как фильтры Блума в 10 раз ускорили SQLite
  17. Oracle: вероятностный Bloom filter
  18. HyperLogLog в PostgreSQL
  19. Алгоритм HyperLogLog, или Оцениваем мощность множества за O(1)
  20. Проверка на уникальность в больших данных с HyperLogLog (Основы Redis)
  21. Bloom Filter Datatype for Redis (en)
  22. Вероятностные структуры данных и где они обитают
  23. Cassandra | Bloom Filters (en, документация)
  24. Bloom Filters by Example (en, онлайн-пример фильтра Блума)

Видео

  1. Хеш-таблицы, фильтр Блума
  2. Фильтр Блума Bloom filters | Хэширование строк String hashing
  3. Структура данных: фильтр Блума
  4. Алгоритмы для распределенных систем: Фильтр Блума, Дерево Меркла, ГСЧ на основе RSA
  5. Проектирование ПО - Лекция 6.2 - Bloom Filter
  6. Redis HyperLogLog Explained
  7. Алгоритмы и структуры данных 14 Открытый ключ, кукушка, фильтр Блума
  8. Лекция 7: Фильтры Блума (часть I)
  9. Идеальное хеширование, хеширование кукушки, фильтр Блума
  10. Хэш-таблицы за 10 минут