Фильтр Блума - Bloom filter

А Фильтр Блума является компактным вероятностный структура данных, задуманный Бертон Ховард Блум в 1970 году это использовалось для проверки того, элемент является членом набор. Ложный положительный результат совпадения возможны, но ложные отрицания не являются - другими словами, запрос возвращает либо «возможно, в наборе», либо «определенно не в наборе». Элементы могут быть добавлены в набор, но не удалены (хотя это можно решить с помощью подсчет фильтра Блума вариант); чем больше добавлено элементов, тем больше вероятность ложных срабатываний.

Блум предложил метод для приложений, в которых объем исходных данных потребовал бы непрактично большого объема памяти, если бы "обычный" безошибочный хеширование техники были применены. Он привел пример алгоритм расстановки переносов для словаря из 500 000 слов, из которых 90% следуют простым правилам расстановки переносов, а оставшиеся 10% требуют дорогостоящего доступа к диску для получения определенных шаблонов расстановки переносов. При достаточном основная память можно использовать безошибочный хэш, чтобы исключить все ненужные обращения к диску; с другой стороны, с ограниченной основной памятью метод Блума использует меньшую хеш-область, но все же устраняет большинство ненужных обращений. Например, хеш-область, составляющая лишь 15% от размера, необходимого для идеального безошибочного хеширования, по-прежнему исключает 85% обращений к диску.[1]

В целом, менее 10 биты на элемент требуются для вероятности ложного срабатывания 1%, независимо от размера или количества элементов в наборе.[2]

Описание алгоритма

Пример фильтра Блума, представляющий набор {Икс, у, z} . Цветные стрелки показывают позиции в битовом массиве, которым сопоставлен каждый элемент набора. Элемент ш нет в наборе {Икс, у, z} , потому что он хеширует одну позицию битового массива, содержащую 0. На этом рисунке м = 18 и k = 3.

An пустой фильтр Блума это битовый массив из м биты, все установлены в 0. Также должны быть k разные хэш-функции определены, каждый из которых карты или хеширует некоторый элемент набора в один из м позиции массива, генерирующие равномерное случайное распределение. Обычно k - небольшая константа, которая зависит от желаемой частоты ложных ошибок. ε, пока м пропорционально k и количество добавляемых элементов.

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

К запрос для элемента (проверьте, есть ли он в наборе), скормите его каждому из k хэш-функции для получения k позиции массива. Если любой бит в этих позициях равен 0, элемент определенно отсутствует в наборе; если бы это было так, тогда все биты были бы установлены в 1, когда он был вставлен. Если все равны 1, то либо элемент находится в наборе, либо или же биты были случайно установлены в 1 во время вставки других элементов, в результате ложный положительный результат. В простом фильтре Блума невозможно различить два случая, но более продвинутые методы могут решить эту проблему.

Требование проектирования k различные независимые хеш-функции могут быть недопустимыми для больших k. Для хорошей хеш-функции с широким выводом должна быть небольшая корреляция между разными битовыми полями такого хэша, поэтому этот тип хеш-функции можно использовать для генерации нескольких "разных" хэш-функций путем разделения его вывода на несколько битов. поля. В качестве альтернативы можно пройти k разные начальные значения (например, 0, 1, ..., k - 1) хэш-функции, которая принимает начальное значение; или добавьте (или допишите) эти значения к ключу. Для большего м и / или k, независимость хэш-функций может быть ослаблена с незначительным увеличением количества ложных срабатываний.[3] (Конкретно, Диллинджер и Манолиос (2004b) показать эффективность получения k индексы с использованием улучшенное двойное хеширование или же тройное хеширование, варианты двойное хеширование которые фактически являются простыми генераторами случайных чисел, засеянными двумя или тремя значениями хеш-функции.)

Удалить элемент из этого простого фильтра Блума невозможно, потому что невозможно определить, какой из k биты, которым он соответствует, должны быть очищены. Хотя установка любого из этих k битов до нуля достаточно, чтобы удалить элемент, это также удалит любые другие элементы, которые могут отображаться на этот бит. Поскольку простой алгоритм не дает возможности определить, были ли добавлены какие-либо другие элементы, влияющие на биты для удаляемого элемента, очистка любого из битов привела бы к возможности ложноотрицательных результатов.

Единовременное удаление элемента из фильтра Блума можно смоделировать с помощью второго фильтра Блума, который содержит элементы, которые были удалены. Однако ложные срабатывания во втором фильтре становятся ложноотрицательными в составном фильтре, что может быть нежелательно. При таком подходе повторное добавление ранее удаленного элемента невозможно, так как его придется удалить из «удаленного» фильтра.

Часто бывает так, что все ключи доступны, но их перечисление требует больших затрат (например, требует большого количества операций чтения с диска). Когда количество ложных срабатываний становится слишком высоким, фильтр можно регенерировать; это должно быть относительно редким событием.

Преимущества пространства и времени

Фильтр Блума, используемый для ускорения ответов в системе хранения «ключ-значение». Значения хранятся на диске, который имеет медленное время доступа. Решения по фильтру Блума принимаются намного быстрее. Однако, когда фильтр сообщает о положительном результате, совершаются некоторые ненужные обращения к диску (чтобы отсеять ложные срабатывания). Общая скорость ответа лучше с фильтром Блума, чем без фильтра Блума. Однако использование для этой цели фильтра Блума увеличивает использование памяти.[нужна цитата ].

Рискуя ложными срабатываниями, фильтры Блума имеют существенное преимущество в пространстве перед другими структурами данных для представления наборов, таких как самобалансирующиеся бинарные деревья поиска, пытается, хеш-таблицы, или просто массивы или же связанные списки записей. Большинство из них требует хранения как минимум самих элементов данных, что может потребовать от небольшого количества битов для небольших целых чисел до произвольного количества битов, например, для строк (пытается являются исключением, поскольку они могут разделять память между элементами с одинаковыми префиксами). Однако фильтры Блума вообще не хранят элементы данных, и для фактического хранилища должно быть предусмотрено отдельное решение. Связанные структуры влекут за собой дополнительные линейные накладные расходы на пространство для указателей. Фильтр Блума с ошибкой 1% и оптимальным значением kнапротив, требуется всего около 9,6 бит на элемент, независимо от размера элементов. Это преимущество частично объясняется его компактностью, унаследованной от массивов, а частично - его вероятностной природой. Частоту ложных срабатываний в 1% можно уменьшить в десять раз, добавив всего около 4,8 бит на элемент.

Однако, если количество потенциальных значений невелико и многие из них могут быть в наборе, фильтр Блума легко превзойти детерминированный битовый массив, что требует только одного бита для каждого потенциального элемента. Хеш-таблицы получают преимущество в пространстве и времени, если они начинают игнорировать коллизии и сохраняют только то, содержит ли каждый сегмент запись; в данном случае они фактически превратились в фильтры Блума с k = 1.[4]

Фильтры Блума также обладают необычным свойством: время, необходимое либо для добавления элементов, либо для проверки того, находится ли элемент в наборе, является фиксированной константой, O (k), совершенно независимо от количества элементов в наборе. Никакая другая структура данных с постоянным пространством не имеет этого свойства, но среднее время доступа разреженного хеш-таблицы может сделать их на практике быстрее, чем некоторые фильтры Блума. Однако в аппаратной реализации фильтр Блума сияет, потому что его k поиски независимы и могут быть распараллелены.

Чтобы понять его эффективность использования пространства, поучительно сравнить общий фильтр Блума с его частным случаем, когда k = 1. Если k = 1, то для того, чтобы поддерживать достаточно низкую частоту ложных срабатываний, следует установить небольшую долю битов, что означает, что массив должен быть очень большим и содержать длинные серии нулей. В информационное содержание массива относительно его размера невелика. Обобщенный фильтр Блума (k больше 1) позволяет установить намного больше битов, сохраняя при этом низкую частоту ложных срабатываний; если параметры (k и м) выбраны удачно, примерно половина битов будет установлена,[5] и они будут очевидно случайными, что минимизирует избыточность и максимизирует информационное содержание.

Вероятность ложных срабатываний

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

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

Если k - количество хеш-функций, и каждая из них не имеет значимой корреляции между собой, тогда вероятность того, что бит не установлен в 1 ни одной из хеш-функций, равна

Мы можем использовать хорошо известную идентичность для е−1

сделать вывод, что для больших м,

Если мы вставили п элементов, вероятность того, что определенный бит по-прежнему равен 0, равна

вероятность того, что это 1, поэтому

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

Это не совсем правильно, поскольку предполагает независимость вероятностей каждого установленного бита. Однако, предполагая, что это близкое приближение, мы имеем, что вероятность ложных срабатываний уменьшается, поскольку м (количество бит в массиве) увеличивается и увеличивается по мере п (количество вставленных элементов) увеличивается.

Альтернативный анализ, приводящий к тому же приближению без предположения о независимости, представлен Митценмахером и Упфалом.[6] После всего п добавлены элементы в фильтр Блума, пусть q быть долей м биты, которые установлены в 0. (То есть количество битов, все еще установленных в 0, равно qm.) Затем, при проверке принадлежности элемента, не входящего в набор, для позиции массива, заданной любым из k хэш-функции, вероятность того, что бит будет установлен в 1, равна . Так что вероятность того, что все k хэш-функции обнаруживают, что их бит установлен в 1, . Далее, ожидаемое значение q это вероятность того, что данная позиция массива не будет затронута каждым из k хэш-функции для каждой из п предметы, которые (как указано выше)

.

Без предположения независимости можно доказать, что q очень сильно сконцентрирован вокруг своего ожидаемого значения. В частности, из Неравенство Адзумы – Хёффдинга, они доказывают, что[7]

Из-за этого мы можем сказать, что точная вероятность ложных срабатываний равна

как прежде.

Оптимальное количество хеш-функций

Количество хеш-функций, k, должно быть положительное целое число. Отложив это ограничение в сторону, для данного м и п, значение k что минимизирует вероятность ложного срабатывания

Необходимое количество бит, м, данный п (количество вставленных элементов) и желаемая вероятность ложного срабатывания ε (и предполагая оптимальное значение k используется) можно вычислить, подставив оптимальное значение k в вероятностном выражении выше:

который можно упростить до:

Это приводит к:

Таким образом, оптимальное количество бит на элемент

с соответствующим количеством хеш-функций k (без учета целостности):

Это означает, что для данной вероятности ложного срабатывания ε, длина фильтра Блума м пропорционально количеству фильтруемых элементов п а необходимое количество хеш-функций зависит только от целевой вероятности ложного срабатывания ε.[8]

Формула является приблизительным по трем причинам. Во-первых, и это наименее опасно, это приблизительно в качестве , которое является хорошим асимптотическим приближением (т. е. выполняется как м → ∞). Во-вторых, что вызывает большее беспокойство, он предполагает, что во время теста членства событие, когда один проверяемый бит установлен в 1, не зависит от события, когда любой другой тестируемый бит установлен в 1. В-третьих, что наиболее важно, предполагается, что случайно является целым.

Гоэль и Гупта,[9] тем не менее, дайте строгую верхнюю оценку, которая не делает никаких приближений и не требует никаких предположений. Они показывают, что вероятность ложного срабатывания для конечного фильтра Блума с м биты (), п элементы и k хэш-функции не более

Эту оценку можно интерпретировать как утверждение, что приближенная формула может применяться со штрафом не более половины дополнительного элемента и не более одного бита.

Приблизительное количество элементов в фильтре Блума

Свамидасс и Балди (2007) показал, что количество элементов в фильтре Блума можно приблизительно оценить по следующей формуле:

куда это оценка количества элементов в фильтре, м - длина (размер) фильтра, k - количество хэш-функций, а Икс - количество битов, равное единице.

Объединение и пересечение множеств

Фильтры Блума - это способ компактного представления набора элементов. Обычно пытаются вычислить размер пересечения или объединения двух наборов. Фильтры Блума можно использовать для приблизительного определения размера пересечения и объединения двух наборов. Свамидасс и Балди (2007) показал, что для двух фильтров Блума длины м, их количество соответственно можно оценить как

и

Размер их союза можно оценить как

куда - это количество битов, равное единице в любом из двух фильтров Блума. Наконец, пересечение можно оценить как

используя три формулы вместе.

Интересные свойства

  • В отличие от стандартного хеш-таблица с помощью открытая адресация за разрешение столкновения фильтр Блума фиксированного размера может представлять набор с произвольно большим количеством элементов; добавление элемента никогда не заканчивается неудачей из-за «заполнения» структуры данных. Однако частота ложных срабатываний постоянно увеличивается по мере добавления элементов, пока все биты в фильтре не будут установлены в 1, после чего все запросы дают положительный результат. При хешировании с открытой адресацией ложные срабатывания никогда не возникают, но производительность постоянно ухудшается, пока не приближается к линейному поиску.
  • Союз и пересечение фильтров Блума с одинаковым размером и набором хеш-функций можно реализовать с побитовый Операции ИЛИ и И соответственно. Операция объединения в фильтрах Блума без потерь в том смысле, что результирующий фильтр Блума совпадает с фильтром Блума, созданным с нуля с использованием объединения двух наборов. Операция пересечения удовлетворяет более слабому свойству: вероятность ложного срабатывания в результирующем фильтре Блума не превышает вероятность ложного срабатывания в одном из составляющих фильтров Блума, но может быть больше, чем вероятность ложного срабатывания в фильтре Блума, созданном с нуля с использованием пересечение двух наборов.
  • Некоторые виды наложенный код можно рассматривать как фильтр Блума, реализованный с помощью физических карты с надрезом. Примером является Затокодирование, изобретенный Кальвин Мурс в 1947 году, в котором набор категорий, связанных с частью информации, представлен в виде выемок на карточке со случайным шаблоном из четырех выемок для каждой категории.

Примеры

  • Плодовые мошки использовать модифицированную версию фильтров Блума для обнаружения новизны запахов с дополнительными функциями, включая сходство нового запаха с ранее испытанными примерами, а также время, прошедшее с момента предыдущего опыта того же запаха.[10]
  • Серверы Akamai Technologies, а доставка контента Поставщик, используйте фильтры Блума, чтобы предотвратить сохранение в его дисковых кэшах "одноразовых чудес". Одноразовые чудеса - это веб-объекты, запрашиваемые пользователями только один раз, что, как обнаружил Akamai, применимо почти к трем четвертям их инфраструктуры кэширования. Использование фильтра Блума для обнаружения второго запроса веб-объекта и кэширования этого объекта только при его втором запросе предотвращает попадание «чудес с одним попаданием» в дисковый кеш, что значительно снижает нагрузку на диск и увеличивает частоту попаданий в дисковый кеш.[11]
  • Google Большой стол, Apache HBase и Apache Cassandra и PostgreSQL[12] используйте фильтры Блума, чтобы уменьшить количество запросов на диск для несуществующих строк или столбцов. Избежание дорогостоящих поисков на диске значительно увеличивает производительность операции запроса к базе данных.[13]
  • В Гугл Хром веб-браузер, используемый для использования фильтра Блума для выявления вредоносных URL-адресов. Любой URL-адрес сначала проверялся на соответствие локальному фильтру Блума, и только в том случае, если фильтр Блума давал положительный результат, выполнялась полная проверка URL-адреса (и пользователь предупреждал, если это тоже вернуло положительный результат).[14][15]
  • Microsoft Bing (поисковая система) использует многоуровневые иерархические фильтры Блума для своего поискового индекса, BitFunnel. Фильтры Блума обеспечивали меньшую стоимость, чем предыдущий индекс Bing, основанный на перевернутые файлы.[16]
  • В Кальмар Интернет Прокси Кеш использует фильтры Блума для дайджесты кеша.[17]
  • Биткойн использовал фильтры Блума для ускорения синхронизации кошелька до тех пор, пока не были обнаружены уязвимости конфиденциальности с применением фильтров Блума.[18][19]
  • В Venti Система архивного хранения использует фильтры Блума для обнаружения ранее сохраненных данных.[20]
  • В Проверка модели SPIN использует фильтры Блума для отслеживания достижимого пространства состояний для больших проблем проверки.[21]
  • В Каскадный Платформа аналитики использует фильтры Блума для ускорения асимметричных объединений, когда один из объединенных наборов данных значительно больше другого (в литературе по базам данных это часто называется объединением Блума).[22]
  • В Exim Агент передачи почты (MTA) использует фильтры Блума в своей функции ограничения скорости.[23]
  • Середина использует фильтры Блума, чтобы не рекомендовать статьи, которые пользователь ранее читал.[24]
  • Ethereum использует фильтры Блума для быстрого поиска журналов в блокчейне Ethereum.

Альтернативы

Использование классических фильтров Блума бит пространства на вставленный ключ, где - частота ложных срабатываний фильтра Блума. Однако пространство, которое строго необходимо для любой структуры данных, играющей ту же роль, что и фильтр Блума, составляет всего лишь за ключ.[25] Следовательно, фильтры Блума используют на 44% больше места, чем эквивалентная оптимальная структура данных. Вместо этого Pagh et al. обеспечить оптимальную структуру данных. Более того, их структура данных имеет постоянную местонахождение ссылки независимо от количества ложных срабатываний, в отличие от фильтров Блума, где более низкий уровень ложных срабатываний приводит к большему количеству обращений к памяти на запрос, . Кроме того, он позволяет удалять элементы без штрафа за место, в отличие от фильтров Блума. Те же улучшенные свойства оптимального использования пространства, постоянной локальности ссылки и возможности удаления элементов также обеспечиваются кукушка фильтр из Fan et al. (2014), реализация которого с открытым исходным кодом доступна.

Стерн и укроп (1996) описать вероятностную структуру на основе хеш-таблицы, сжатие хэша, который Диллинджер и Манолиос (2004b) определить как значительно более точный, чем фильтр Блума, если каждый из них настроен оптимально. Диллинджер и Манолиос, однако, отмечают, что разумная точность любого заданного фильтра Блума в широком диапазоне количества добавлений делает его привлекательным для вероятностного перечисления пространств состояний неизвестного размера. Таким образом, сжатие хэша является привлекательным, когда количество добавлений можно точно спрогнозировать; однако, несмотря на то, что это очень быстрое программное обеспечение, сжатие хэшей плохо подходит для аппаратного обеспечения из-за наихудшего линейного времени доступа.

Путце, Сандерс и Синглер (2007) изучили некоторые варианты фильтров Блума, которые либо работают быстрее, либо занимают меньше места, чем классические фильтры Блума. Основная идея быстрого варианта состоит в том, чтобы поместить k значений хэша, связанных с каждым ключом, в один или два блока, имеющих тот же размер, что и блоки кеш-памяти процессора (обычно 64 байта). Предположительно, это улучшит производительность за счет уменьшения количества потенциальной памяти. промахи в кеше. Однако предлагаемые варианты имеют недостаток в том, что они используют примерно на 32% больше места, чем классические фильтры Блума.

Вариант с эффективным использованием пространства основан на использовании одной хеш-функции, которая генерирует для каждого ключа значение в диапазоне куда - запрошенная частота ложных срабатываний. Затем последовательность значений сортируется и сжимается с использованием Кодирование Голомба (или какой-либо другой метод сжатия), чтобы занять пространство, близкое к биты. Чтобы запросить фильтр Блума для данного ключа, достаточно проверить, сохранено ли его соответствующее значение в фильтре Блума. Распаковка всего фильтра Блума для каждого запроса сделает этот вариант совершенно непригодным для использования.Чтобы решить эту проблему, последовательность значений разделяется на небольшие блоки равного размера, которые сжимаются отдельно. Во время запроса в среднем нужно будет распаковать только половину блока. Из-за накладных расходов на декомпрессию этот вариант может быть медленнее, чем классические фильтры Блума, но это может быть компенсировано тем фактом, что необходимо вычислить одну хэш-функцию.

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

Граф и Лемир (2019) описывает подход, называемый фильтром xor, где они хранят отпечатки пальцев в определенном типе идеальный хеш таблица, создающая фильтр, который более эффективен с точки зрения памяти ( бит на ключ) и быстрее, чем фильтры Блума или кукушки. (Экономия времени достигается за счет того, что поиск требует ровно трех обращений к памяти, которые могут выполняться параллельно.) Однако создание фильтра сложнее, чем фильтры Блума и кукушки, и невозможно изменить набор после создания.

Расширения и приложения

Существует более 60 вариантов фильтров Блума, множество обзоров в данной области и постоянный отток приложений (см., Например, Luo, и другие [26]). Некоторые из вариантов в значительной степени отличаются от исходного предложения, чтобы быть нарушением или развилкой исходной структуры данных и ее философии.[27] Обработка, которая объединяет фильтры Блума с другими работами над случайные прогнозы, сжатие, и хеширование с учетом местоположения еще предстоит сделать (хотя см. Дасгупта, и другие[28] за одну попытку, вдохновленную нейробиологией).

Фильтрация кеша

Использование фильтра Блума для предотвращения сохранения случайных чудес в веб-кеше снизило скорость записи на диск почти наполовину, уменьшив нагрузку на диски и потенциально увеличив производительность диска.[11]

Сети доставки контента развертывать веб-кеши по всему миру, чтобы кэшировать и предоставлять пользователям веб-контент с большей производительностью и надежностью. Ключевое применение фильтров Блума - их использование для эффективного определения, какие веб-объекты хранить в этих веб-кэшах. Почти три четверти URL-адресов, к которым осуществляется доступ из типичного веб-кеша, представляют собой «чудеса одного обращения», к которым пользователи обращаются только один раз и никогда больше. Совершенно очевидно, что дисковые ресурсы хранить в веб-кеше одноразовые чудеса расточительно, поскольку к ним больше никогда не будет доступа. Чтобы предотвратить кеширование «чудеса одного удара», используется фильтр Блума для отслеживания всех URL-адресов, к которым обращаются пользователи. Веб-объект кэшируется только в том случае, если к нему обращались по крайней мере один раз, то есть объект кэшируется по его второму запросу. Использование фильтра Блума таким образом значительно снижает нагрузку на запись на диск, поскольку «чудеса с одним щелчком» никогда не записываются в кэш диска. Кроме того, отфильтровывая одноразовые чудеса, вы также экономите место в кэше на диске, увеличивая частоту попаданий в кэш.[11]

Как избежать ложных срабатываний в конечной вселенной

Целовать и другие [29] описал новую конструкцию для фильтра Блума, которая позволяет избежать ложных срабатываний в дополнение к типичному отсутствию ложноотрицательных результатов. Конструкция применима к конечной вселенной, из которой взяты элементы множества. Он основан на существующей схеме неадаптивного комбинаторного группового тестирования Эппштейна, Гудрича и Хиршберга. В отличие от типичного фильтра Блума, элементы хешируются в битовый массив с помощью детерминированных, быстрых и простых для вычисления функций. Максимальный размер набора, при котором полностью исключаются ложные срабатывания, зависит от размера юниверса и контролируется объемом выделенной памяти.

Подсчет фильтров Блума

Подсчетные фильтры позволяют реализовать Удалить работа с фильтром Блума без повторного создания фильтра. В счетном фильтре позиции массива (сегменты) расширяются от одного бита до многобитового счетчика. Фактически, обычные фильтры Блума можно рассматривать как счетные фильтры с размером корзины в один бит. Счетные фильтры были введены Fan et al. (2000).

Операция вставки расширена до приращение значение сегментов, и операция поиска проверяет, что каждый из требуемых сегментов не равен нулю. Затем операция удаления состоит из уменьшения значения каждого из соответствующих сегментов.

Арифметическое переполнение ковшей является проблемой, и ковши должны быть достаточно большими, чтобы сделать этот случай редким. Если это происходит, то операции увеличения и уменьшения должны оставлять для корзины максимально возможное значение, чтобы сохранить свойства фильтра Блума.

Размер счетчиков обычно составляет 3 или 4 бита. Следовательно, подсчетные фильтры Блума занимают в 3-4 раза больше места, чем статические фильтры Блума. Напротив, структуры данных Паг, Паг и Рао (2005) и Fan et al. (2014) также разрешают удаления, но занимают меньше места, чем статический фильтр Блума.

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

Bonomi et al. (2006) представила структуру данных, основанную на хешировании d-left, которая функционально эквивалентна, но использует примерно половину места, чем подсчет фильтров Блума. Проблема масштабируемости не возникает в этой структуре данных. Как только проектная емкость будет превышена, ключи можно будет повторно вставить в новую хэш-таблицу двойного размера.

Экономичный вариант от Путце, Сандерс и Синглер (2007) также может использоваться для реализации фильтров подсчета, поддерживая вставки и удаления.

Rottenstreich, Kanizo & Keslassy (2012) представил новый общий метод, основанный на переменном приращении, который значительно улучшает вероятность ложных срабатываний при подсчете фильтров Блума и их вариантов, но при этом поддерживает удаления. В отличие от подсчета фильтров Блума, при каждой вставке элемента хешированные счетчики увеличиваются на приращение хэшированной переменной вместо единичного приращения. Чтобы запросить элемент, учитываются точные значения счетчиков, а не только их положительность. Если сумма, представленная значением счетчика, не может быть составлена ​​из соответствующего приращения переменной для запрошенного элемента, на запрос может быть возвращен отрицательный ответ.

Kim et al. (2019) показывает, что количество ложных срабатываний фильтра Подсчета Блума уменьшается от k = 1 до точки, определенной , и увеличивается от в положительную бесконечность и находит как функция порога счета.[30]

Децентрализованное агрегирование

Фильтры Блума могут быть организованы в распределенные структуры данных выполнять полностью децентрализованные вычисления агрегатные функции. Децентрализованная агрегация делает коллективные измерения локально доступными в каждом узле распределенной сети без привлечения для этой цели централизованного вычислительного объекта.[31]

Распределенные фильтры Блума

Распределенный фильтр Блума Single Shot для обнаружения дубликатов с частотой ложных срабатываний: 6 элементов распределяются по 3 PE, каждый с битовым массивом длиной 4. На первом этапе связи PE 1 дважды получает хэш '2' и отправляет его обратно любому ЧП 2 или 3, в зависимости от того, кто отправил позже. PE, который получает хэш "2", затем ищет элемент с этим хешем и отмечает его как возможный дубликат.

Фильтры Параллельного Блума могут быть реализованы, чтобы использовать преимущества нескольких элементы обработки (PE) присутствуют в параллельные машины без совместного использования ресурсов. Одним из основных препятствий для параллельного фильтра Блума является организация и передача неупорядоченных данных, которые, как правило, равномерно распределяются по всем PE при инициации или при пакетной вставке. Чтобы упорядочить данные, можно использовать два подхода: либо фильтр Блума по всем данным, хранящимся на каждом PE, называемый реплицирующим фильтром Блума, либо фильтр Блума по всем данным, разделенным на равные части, причем каждый PE сохраняет одну часть. .[32] Для обоих подходов используется фильтр Блума «Single Shot», который вычисляет только один хэш, в результате чего на каждый элемент приходится один перевернутый бит, чтобы уменьшить объем связи.

Распределенные фильтры Блума инициируются сначала хешированием всех элементов на их локальном PE, а затем их локальной сортировкой по хэшам. Это можно сделать за линейное время, используя, например, Ковшовая сортировка а также позволяет обнаруживать локальные дубликаты. Сортировка используется для группировки хэшей с назначенным им PE в качестве разделителя для создания фильтра Блума для каждой группы. После кодирования этих фильтров Блума с использованием, например, Кодирование Голомба каждый фильтр bloom отправляется в виде пакета PE, который отвечает за вставленные в него значения хеш-функции. PE p отвечает за все хеши между значениями и , где s - общий размер фильтра Блума по всем данным. Поскольку каждый элемент хешируется только один раз и, следовательно, устанавливается только один бит, для проверки того, был ли элемент вставлен в фильтр Блума, необходимо работать только с PE, ответственным за хэш-значение элемента. Операции одиночной вставки также могут быть выполнены эффективно, потому что фильтр Блума только для одного PE должен быть изменен, по сравнению с репликационными фильтрами Блума, где каждый PE должен обновлять свой фильтр Блума. Распределив глобальный фильтр Блума по всем PE вместо того, чтобы хранить его отдельно на каждом PE, размер фильтров Блума может быть намного больше, что приведет к увеличению емкости и снижению частоты ложных срабатываний.
Распределенные фильтры Блума можно использовать для улучшения алгоритмов обнаружения дубликатов.[33] путем фильтрации самых «уникальных» элементов. Их можно вычислить, передав только хэши элементов, а не сами элементы, которые намного больше по объему, и удалив их из набора, уменьшив рабочую нагрузку для алгоритма обнаружения дубликатов, используемого впоследствии.

Во время передачи хэшей PE ищут биты, которые установлены более чем в одном из принимающих пакетов, поскольку это будет означать, что два элемента имеют одинаковый хэш и, следовательно, могут быть дубликатами. Если это происходит, сообщение, содержащее индекс бита, который также является хешем элемента, который может быть дубликатом, отправляется PE, которые отправили пакет с установленным битом. Если несколько индексов отправляются одному и тому же PE одним отправителем, может быть выгодно также кодировать индексы. Все элементы, хэш которых не был отправлен обратно, теперь гарантированно не будут дублироваться и не будут оцениваться дальше, для остальных элементов используется алгоритм перераспределения[34] может быть использован. Сначала все элементы, хеш-значение которых было отправлено обратно, отправляются в PE, за который отвечает их хэш. Теперь любой элемент и его дубликат гарантированно находятся на одном PE. На втором этапе каждый PE использует последовательный алгоритм для обнаружения дубликатов на принимающих элементах, которые составляют лишь часть количества начальных элементов. Допуская ложное срабатывание для дубликатов, объем связи можно еще больше уменьшить, поскольку PE вообще не должны отправлять элементы с дублированными хэшами, и вместо этого любой элемент с дублированным хешем можно просто пометить как дубликат. В результате частота ложных срабатываний при обнаружении дубликатов такая же, как и частота ложных срабатываний используемого фильтра Блума.

Процесс фильтрации наиболее «уникальных» элементов также можно повторять несколько раз, изменяя хэш-функцию на каждом этапе фильтрации. Если используется только один шаг фильтрации, он должен архивировать небольшую частоту ложных срабатываний, однако, если шаг фильтрации повторяется один раз, первый шаг может позволить более высокую частоту ложных срабатываний, в то время как последний имеет более высокий уровень, но также работает с меньшим количеством элементов. многие из них уже были удалены на предыдущем этапе фильтрации. Хотя использование более двух повторений может дополнительно уменьшить объем связи, если количество дубликатов в наборе невелико, отдача от дополнительных сложностей низка.

Репликация фильтров Блума организовывать свои данные с помощью хорошо известных гиперкуб алгоритм для сплетен, например[35] Сначала каждый PE вычисляет фильтр Блума по всем локальным элементам и сохраняет его. Повторяя цикл, в котором на каждом шаге i PE отправляют свой локальный фильтр Блума по измерению i и объединяют фильтр Блума, который они получают по измерению, со своим локальным фильтром Блума, можно удвоить элементы, содержащиеся в каждом фильтре Блума, на каждой итерации. После отправки и получения Bloom фильтрует все Размеры каждый PE содержит глобальный фильтр Блума по всем элементам.

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

Синхронизация данных

Фильтры Блума можно использовать для приблизительного синхронизация данных как в Byers et al. (2004). Подсчет фильтров Блума можно использовать для приблизительного определения количества различий между двумя наборами, и этот подход описан в Агарвал и Трахтенберг (2006).

Фильтры Блумье

Chazelle et al. (2004) разработал обобщение фильтров Блума, которое могло связывать значение с каждым вставленным элементом, реализуя ассоциативный массив. Как и фильтры Блума, эти структуры достигают небольших накладных расходов за счет допуска небольшой вероятности ложных срабатываний. В случае "фильтров Блумье" ложный положительный результат определяется как возвращающий результат, когда ключ отсутствует на карте. Карта никогда не вернет неправильное значение для ключа, который является на карте.

Компактные аппроксиматоры

Болди и Винья (2005) предложил решетка обобщение фильтров Блума. А компактный аппроксиматор связывает с каждым ключом элемент решетки (стандартные фильтры Блума являются случаем булевой двухэлементной решетки). Вместо битового массива у них есть массив элементов решетки. При добавлении новой связи между ключом и элементом решетки они вычисляют максимум текущего содержимого k расположение массива, связанное с ключом с элементом решетки. При чтении значения, связанного с ключом, они вычисляют минимум значений, найденных в k места, связанные с ключом. Полученное значение приблизительно соответствует исходному значению сверху.

Параллельно-секционные фильтры Блума

В этой реализации для каждой хеш-функции использовался отдельный массив. Этот метод позволяет выполнять параллельные вычисления хешей как для вставок, так и для запросов.[36]

Стабильные фильтры Блума

Дэн и Рафиэй (2006) предложил фильтры Стабильного Блума как вариант фильтров Блума для потоковой передачи данных. Идея заключается в том, что, поскольку нет возможности хранить всю историю потока (которая может быть бесконечной), фильтры Stable Bloom постоянно удаляют устаревшую информацию, чтобы освободить место для более новых элементов. Поскольку устаревшая информация удаляется, фильтр Stable Bloom вводит ложноотрицательные сообщения, которые не отображаются в традиционных фильтрах Bloom. Авторы показывают, что гарантируется жесткая верхняя граница частоты ложных срабатываний, и этот метод превосходит стандартные фильтры Блума с точки зрения частоты ложных срабатываний и эффективности по времени, когда задано небольшое пространство и приемлемая частота ложных срабатываний.

Масштабируемые фильтры Блума

Алмейда и др. (2007) предложил вариант фильтров Блума, который может динамически адаптироваться к количеству хранимых элементов, обеспечивая при этом минимальную вероятность ложного срабатывания. Этот метод основан на последовательностях стандартных фильтров Блума с увеличивающейся пропускной способностью и меньшей вероятностью ложных срабатываний, чтобы гарантировать, что максимальная вероятность ложного срабатывания может быть установлена ​​заранее, независимо от количества вставляемых элементов.

Фильтры пространственного Блума

Фильтры пространственного Блума (SBF) были первоначально предложены Пальмиери, Кальдерони и Майо (2014) как структура данных, предназначенная для хранения Информация о местонахождении, особенно в контексте криптографических протоколов для определения местоположения Конфиденциальность. Однако главной характеристикой SBF является их способность хранить несколько наборов в единой структуре данных, что делает их пригодными для множества различных сценариев приложений.[37] Принадлежность элемента к определенному набору может быть запрошена, и вероятность ложного срабатывания зависит от набора: первые наборы, вводимые в фильтр во время построения, имеют более высокие вероятности ложных срабатываний, чем наборы, введенные в конце.[38] Это свойство позволяет устанавливать приоритеты наборов, где могут быть сохранены наборы, содержащие более «важные» элементы.

Многослойные фильтры Блума

Многослойный фильтр Блума состоит из нескольких слоев фильтра Блума. Слоистые фильтры Bloom позволяют отслеживать, сколько раз элемент был добавлен в фильтр Bloom, проверяя, сколько слоев содержит элемент. С многоуровневым фильтром Блума операция проверки обычно возвращает номер самого глубокого слоя, в котором был найден элемент.[39]

Аттенуированные фильтры Блума

Пример ослабленного фильтра Блума: найдите образец 11010, начиная с узла n1.

Ослабленный фильтр Блума глубины D можно рассматривать как массив D обычных фильтров Блума. В контексте обнаружения служб в сети каждый узел локально хранит обычные и ослабленные фильтры Блума. Обычный или локальный фильтр Блума указывает, какие услуги предлагает сам узел. Ослабленный фильтр уровня i указывает, какие услуги могут быть найдены на узлах, удаленных на i-хоп от текущего узла. I-е значение создается путем объединения локальных фильтров Блума для узлов, i-хопов от которых нет.[40]

В качестве примера возьмем небольшую сеть, показанную на графике ниже. Предположим, мы ищем службу A, идентификатор которой хэшируется до битов 0,1 и 3 (шаблон 11010). Пусть узел n1 будет отправной точкой. Сначала мы проверяем, предлагается ли услуга A пользователем n1, проверяя его локальный фильтр. Поскольку шаблоны не совпадают, мы проверяем ослабленный фильтр Блума, чтобы определить, какой узел должен быть следующим переходом. Мы видим, что n2 не предлагает услуги A, но находится на пути к узлам, которые ее предоставляют. Следовательно, мы переходим к n2 и повторяем ту же процедуру. Мы быстро обнаруживаем, что n3 предлагает услугу, и, следовательно, находится пункт назначения.[41]

Используя ослабленные фильтры Блума, состоящие из нескольких слоев, можно обнаруживать услуги на расстоянии более одного скачка, избегая при этом насыщения фильтра Блума путем ослабления (смещения) битов, установленных более удаленными источниками.[40]

Поиск химической структуры

Фильтры Блума часто используются для поиска в больших базах данных о химических структурах (см. химическое сходство ). В простейшем случае элементы, добавленные к фильтру (называемые отпечатком пальца в этом поле), представляют собой просто атомные номера, присутствующие в молекуле, или хэш, основанный на атомном номере каждого атома, а также количестве и типе его связей. Этот случай слишком прост, чтобы быть полезным. Более продвинутые фильтры также кодируют количество атомов, более крупные элементы субструктуры, такие как карбоксильные группы, и свойства графа, такие как количество колец. В отпечатках на основе хэша хеш-функция, основанная на свойствах атома и связи, используется для превращения подграфа в ГПСЧ seed и первые выходные значения, используемые для установки битов в фильтре Блума.

Молекулярные отпечатки пальцев появились в конце 1940-х годов как способ поиска химических структур на перфокартах. Однако только примерно в 1990 году компания Daylight Chemical Information Systems, Inc. представила метод на основе хешей для генерации битов, а не использование предварительно вычисленной таблицы. В отличие от словарного подхода, метод хеширования может назначать биты для подструктур, которые ранее не использовались. В начале 1990-х термин «отпечаток пальца» считался отличным от «структурных ключей», но с тех пор этот термин расширился, чтобы охватывать большинство молекулярных характеристик, которые можно использовать для сравнения сходства, включая структурные ключи, разреженные отпечатки пальцев и трехмерные отпечатки пальцев. . В отличие от фильтров Блума, метод хеширования Daylight позволяет количеству битов, назначенных для каждой функции, быть функцией размера функции, но большинство реализаций Daylight-подобных отпечатков пальцев используют фиксированное количество бит на функцию, что делает их фильтром Блума. Исходные отпечатки пальцев Daylight можно было использовать как для сравнения, так и для проверки. Многие другие типы отпечатков пальцев, такие как популярный ECFP2, можно использовать для определения сходства, но не для проверки, поскольку они включают местные характеристики окружающей среды, которые при использовании в качестве экрана создают ложноотрицательные результаты. Даже если они созданы с использованием одного и того же механизма, это не фильтры Блума, потому что их нельзя использовать для фильтрации.

Смотрите также

Примечания

  1. ^ Блум (1970).
  2. ^ Bonomi et al. (2006).
  3. ^ Диллинджер и Манолиос (2004a); Кирш и Митценмахер (2006).
  4. ^ Митценмахер и Упфаль (2005).
  5. ^ Бластейн и Эль-Маазави (2002), стр. 21–22
  6. ^ Митценмахер и Упфаль (2005) С. 109–111, 308.
  7. ^ Митценмахер и Упфаль (2005), п. 308.
  8. ^ Старобинский, Трахтенберг и Агарвал (2003)
  9. ^ Гоэль и Гупта (2010)
  10. ^ Дасгупта, Санджой; Sheehan, Timothy C .; Стивенс, Чарльз Ф .; Навлаха, Сакет (18.12.2018). «Нейронная структура данных для обнаружения новизны». Труды Национальной академии наук. 115 (51): 13093–13098. Дои:10.1073 / pnas.1814448115. ISSN  0027-8424. ЧВК  6304992. PMID  30509984.
  11. ^ а б c Мэггс и Ситараман (2015).
  12. ^ "Модуль Bloom index contrib". Postgresql.org. 2016-04-01. Архивировано из оригинал на 2018-09-09. Получено 2016-06-18.
  13. ^ Chang et al. (2006); Фонд программного обеспечения Apache (2012 г.).
  14. ^ Якунин, Алексей (25.03.2010). «Блог Алекса Якунина: приложение-фильтр Nice Bloom». Blog.alexyakunin.com. Архивировано из оригинал на 2010-10-27. Получено 2014-05-31.
  15. ^ «Проблема 10896048: переход для безопасного просмотра с фильтра Блума на набор префиксов. - Обзор кода». Chromiumcodereview.appspot.com. Получено 2014-07-03.
  16. ^ Гудвин, Боб; Хопкрофт, Майкл; Луу, Дэн; Клеммер, Алекс; Курмей, Михаэла; Эльникети, Самех; Юйсюн, Он (2017). «BitFunnel: пересмотр подписей для поиска» (PDF). СИГИР: 605–614. Дои:10.1145/3077136.3080789.
  17. ^ Весселс (2004).
  18. ^ "BIP 0037". 2012-10-24. Получено 2018-05-29.
  19. ^ "Bloom Filter | Речной глоссарий". River Financial. Получено 2020-11-14.
  20. ^ «План 9 / sys / man / 8 / венты». Plan9.bell-labs.com. Архивировано из оригинал на 2014-08-28. Получено 2014-05-31.
  21. ^ «Спин - формальная проверка».
  22. ^ Маллин (1990).
  23. ^ "Исходный код Exim". github. Получено 2014-03-03.
  24. ^ "Что такое фильтры Блума?". Середина. 2015-07-15. Получено 2015-11-01.
  25. ^ Паг, Паг и Рао (2005).
  26. ^ Ло, Лайлонг; Го, Деке; Ма, Ричард ТБ .; Роттенштрайх, Ори; Ло, Сюешань (13 апреля 2018 г.). «Оптимизация фильтра Блума: проблемы, решения и сравнения». arXiv:1804.04777 [cs.DS ].
  27. ^ Ло, Лайлонг; Го, Деке; Ма, Ричард ТБ .; Роттенштрайх, Ори; Ло, Сюешань (13 апреля 2018 г.). «Оптимизация фильтра Блума: проблемы, решения и сравнения». arXiv:1804.04777 [cs.DS ].
  28. ^ Дасгупта, Санджой; Шихан, Тимоти С .; Стивенс, Чарльз Ф .; Навлахаэ, Сакет (2018). «Нейронная структура данных для обнаружения новизны». Труды Национальной академии наук. 115 (51): 13093–13098. Дои:10.1073 / pnas.1814448115. ЧВК  6304992. PMID  30509984.
  29. ^ Поцелуй, С. З .; Hosszu, E .; Tapolcai, J .; Rónyai, L .; Роттенштрайх, О. (2018). «Фильтр Bloom с ложноположительной свободной зоной» (PDF). IEEE Proceedings of INFOCOM. Получено 4 декабря 2018.
  30. ^ Ким, Кибеом; Чон, Ёнджо; Ли, Ёнджу; Ли, Сунгу (11.07.2019). "Анализ подсчета фильтров цветения, используемых для определения порога подсчета". Электроника. 8 (7): 779. Дои:10.3390 / электроника8070779. ISSN  2079-9292.
  31. ^ Pournaras, Warnier & Brazier (2013).
  32. ^ Сандерс, Петер и Шлаг, Себастьян и Мюллер, Инго (2013). «Коммуникационные эффективные алгоритмы для решения фундаментальных проблем больших данных». Международная конференция IEEE по большим данным, 2013 г.: 15–23.CS1 maint: несколько имен: список авторов (связь)
  33. ^ Шлаг, Себастьян (2013). «Распределенное удаление дубликатов». Карлсруэ технологический институт.
  34. ^ Шатдал, Амбудж и Джеффри Ф. Нотон (1994). «Обработка агрегатов в параллельных системах баз данных». Университет Висконсин-Мэдисон, факультет компьютерных наук: 8.CS1 maint: несколько имен: список авторов (связь)
  35. ^ В. Кумар, А. Грама, А. Гупта и Г. Карипис (1994). Введение в параллельные вычисления. Дизайн и анализ алгоритмов. Бенджамин / Каммингс.CS1 maint: несколько имен: список авторов (связь)
  36. ^ Кирш, Адам; Митценмахер †, Майкл. «Меньше хеширования, та же производительность: создание лучшего фильтра Блума» (PDF). Гарвардская школа инженерии и прикладных наук. Wiley InterScience.
  37. ^ Кальдерони, Пальмиери и Майо (2015).
  38. ^ Кальдерони, Пальмиери и Майо (2018).
  39. ^ Чживанг, Чжунган и Цзянь (2010).
  40. ^ а б Кучерявый и др. (2009).
  41. ^ Кубятович и др. (2000).

Рекомендации

внешняя ссылка