/ / Фільтр "Блум" або "перемішування зозулі"? - алгоритм, хеш, фільтр

Блум-фільтр чи хешування з зозулі? - алгоритм, хеш, фільтр

Що ви віддаєте перевагу і чому?

Вони обидва можуть бути використані для виконання подібних завдань, але мені цікаво, як бачити, що люди використовували в реальних додатках, і їх аргументація для цього.

Відповіді:

9 для відповіді № 1

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

Блум-фільтри використовуються всередині бази данихдвигуни, зокрема Apache Cassandra. Причини тому, як казали інші плакати, щоб зменшити вартість повільних заданих операцій. В принципі, будь-яка операція "може це чи то не існує" з високою вартістю, можна використовувати фільтр Bloom для зменшення кількості виконаних перевірок.

Ще один типовий приклад із сьогоднішньої моделі SaaSбуде віддаленою службою REST з ціною за дзвінок. Будь-який API-виклик із бінарним відповіддю, такий як "це адреса недійсний", може використовувати фільтр "Блум" для усунення більше 90% дублікатів запитів! Зауважте, що оскільки фільтри Bloom та Cuckoo мають помилкові позитиви, вони НЕ корисні для зворотної операції "це адреса VALID"

Важливо пам'ятати про те, що Блум і зозуляфільтри не мають помилкових негативів. Це робить ці фільтри корисними для таких перевірок, як "це, безумовно, не чи можливо спам", але не корисно для операцій, де помилкові спрацьовування неприйнятні, наприклад, перевірка дозволів користувачів. У цьому аспекті вони можуть бути концептуально розглянуті протилежністю кеша. Як фільтр Bloom / Cuckoo, так і кеш використовуються, перш за все, для зменшення вартості дорогих операцій з логічною відповіддю, кеш не має помилкових спрацьовувань, а Bloom / Cuckoo не мають помилкових негативів.

Помітні відмінності між Cuckoo / Bloom включають:

  • Комбінація. Блум-фільтри можуть бути ефективно злиті, якщо вони створюються з однаковими параметрами. І швидко, і з невеликою пропускною здатністю. Ось чому ви бачите, що вони часто використовуються в масово розподілених системах, обмін фільтрами Блум відбувається швидко. Кукушкові фільтри легко складаються, що робить їх менш корисними в цих умовах.

  • Помилкова позитивна швидкість. Кущові фільтри є більш просторовими. Багато випадків використання обох структур зосереджені на низькорівневих мережах. На слабкому апаратному забезпеченні може бути важливим ~ 40% вища ефективність фільтрів для кукушування за тією самою хибною позитивною швидкістю. Реферальна реалізація в c ++ сортує елементи в межах кожного відро для додаткової економії місця, використовуючи позицію елемента в ковші для зберігання менших відбитків пальців. Додаткові бібліотеки, які я згадаю пізніше (включаючи мої), не здаються Зробіть це. Якщо хтось колись використовує мою бібліотеку, я можу додати його :).

  • Постійна хибна позитивна ставка. Фільми "Блум" мають асимптотично гірші помилкові позитивні значення, оскільки вони перевищують їх розміри. Ви можете постійно вставляти елементи, але в кінцевому рахунку ваш помилковий позитивний показник буде майже на 100%. Фільтри зозулі, засновані на хешированні згустка, мають встановлену ємність, де вставки дійсно не зможуть. Повторне вставлення нешаблонних хешей елементів може спричинити невдалу вставку фільтрів зозулі, можливо, далеко до їхнього запланованого рівня заповнення.

  • Швидкість Це суб'єктивно і багато чого залежить від апаратного забезпечення, але фільтри з куку-затею, як правило, швидше в середньому випадку (за моїм досвідом). Більшість дизайнів фільтру Bloom двічі виконують хеш-функції. Особливо, якщо використовувати безпечні хеш-функції, це може бути великою перешкодою у порівнянні з фільтрами з кукушкою, які тільки один раз вставляли елементи. Код, який я бачив, використовує різні функції хешування для фільтрів Bloom і Cuckoo. Гуава Блум Google використовує Murmur3, багато інших реалізацій використовують SHA1 або щось інше. Якщо для випадків користування хеш-коефіцієнтом можна скористатись, переконайтеся, що бібліотека використовує захищений хеш. Важливо знати, що фільтри Bloom мають приблизно постійний час для вставки, тоді як у фільтрів Cuckoo є ситуація AVERAGE з постійним часом. Оскільки фільтри для зозули потрапляють в межах декількох відсотків потужності, швидкість вставки значно сповільнюється. Навіть тоді, лише швидкість вставки сповільнюється, всі інші операції є постійним середнім часом.

  • Гнучкість. Блум-фільтри підтримують тільки вставку і містять. Фільтр зозулі додатково підтримує видалення та обмежений підрахунок. У референтному дизайні фільтри Cuckoo можуть визначати, скільки разів елемент був вставлений, до 7 разів. Фільтри "Блум" можуть визначати "так-ні". Кукушкові фільтри також підтримують видалення вставлених елементів, що є дуже позитивним у багатьох випадках використання у порівнянні з Блумом. Під час використання фільтрів Bloom досить стандартно відтворити фільтр з нуля, коли він є "повним" (оцінка неналежного позитивного значення перевищує порогову величину), оскільки ви не можете видалити старі елементи. Зверніть увагу, що перебудова фільтра все ще відбувається з фільтрами кукушки при вставці починають провалитися, тому в залежності від випадку використання це може виявитись незрозумілим. У певних ситуаціях фільтри кукушкою більш корисні, оскільки ви можете видалити елементи, які залишаються в межах фільтра, а не відновлювати.

  • Підтримка Кукушкові фільтри - нові, і стабільні бібліотеки для багатьох мов просто не існують.

Найбільшою перевагою фільтрів Блум є те, щоу більшості мов вони мають більш розвинену бібліотечну підтримку. Математика за фільтрами Блума також краще зрозуміла вчені. Більшість характеристик фільтрів зозули були визначені емпірично, тоді як фільтри Блума мають тверду чисельну основу. Це виключає фільтри для кукушки в реальному часі та критичних системах, які повинні перевіряти їх ефективність, навіть якщо експериментальні дані показують, що фільтри для кукушки працюють краще в більшості випадків.

Бездоганний плагін: я розробник бібліотеки фільтрів зозулі для Java. CuckooFilter4J . У ньому відсутнє напів-сортування відротому ефективність просторів дещо нижча, ніж еталонна реалізація. У проекті readme я маю посилання на інші реалізації, які я знаю. Яка структура краще залежить від вашої ситуації використання, але в основному з питання про те, чи існує надійна реалізація фільтра Cuckoo для вашої мови.

Ви повинні обов'язково поглянути на джерелоперед тим, як використовувати фільтр Cuckoo / Bloom у виробництві. Я читаю різні либс, перш ніж писати свій власний ... багато хто з них мали обмеження розміру за допомогою 32-розрядних базових масивів або очевидні проблеми продуктивності. Більшість мали нульові тести. Реалізація Google Guava Bloom на сьогодні є найкращою якістю коду та тестами (і підтримує межі 64-бітового масиву). Єдиними недоліками з Guava's Bloom є те, що він не має можливості використовувати безпечну хеш-функцію та isn " т багатопотоковий.

У виробничій системі ви можете захотітибагатопотоковий для швидкості Відповідь для Гуави "Блум" полягає в тому, щоб зробити інший фільтр для кожної нитки і з часом поєднувати їх. Оскільки фільтри з кукушкою не можуть бути об'єднані, я додав одночасну передачу потоку в бібліотеку фільтрів кукушу. Інший, хто знає про те, що не працює в безпеці або не працює одночасно.


8 для відповіді № 2

Що ви віддаєте перевагу, вино чи сир?

А. розцвітати фільтр це коли ви маєте обмежений простір, висока вартість запиту, і в основному негативні запитання.
У цьому випадку а розцвітати фільтр з 8 біт на ключ і 4 хеш-функції дає тобі 2,5% помилково позитивний показник; Ви обробляєте запити майже В 40 разів швидше ніж раніше, за ціною 1 байт на ключ.

З іншого боку, якщо якась з попередні умови не тримаються, a хеш-таблиця виступає в якості кеша має сенс, хоча це, очевидно, займе а набагато більше одного байта на запис :-)

Ви навіть можете пропустити жорсткі випадки хешування зозулі якщо це є кеш-пам'ять, що також робить проблеми із збільшенням розміру хеш-таблиці з кукушкою (або будь-який інший, ніж лінійний хеш).


5 для відповіді № 3

Фільтр зозулі.

"Кукушковий фільтр: практично краще, ніж цвісти". Бен Фан, Давид Андерсен, Майкл Камінскій, Майкл Міцценмахер КоНейст 2014 року. http://dx.doi.org/10.1145/2674005.2674994

Від одного з авторів " блог:

Дозвольте мені описати фільтр з зозулю та деякі з нихщо потрібно для вас. Якщо ви хочете уникнути технічної дискусії, все, що вам потрібно знати, полягає в тому, що для наборів достатньо великих розмірів за тієї самої хибної позитивної швидкості, що й відповідний фільтр Блум, фільтри зозуля використовують менше місця, ніж Блум фільтри, швидше за пошук (але повільніше для вставок / для конструювання), і дивовижно також дозволяють видаляти ключі (які фільтри Bloom не можуть зробити). Якщо ви хочете подивитися на код, то навіть є github сховище для вас з кодом для фільтрів зозулі.


2 для відповіді № 4

Я віддаю перевагу згущення слизни. Я застерігаю від помилкових спрацьовувань, які можуть з'являтися з фільтрами розцвічення при більш високих факторах заповнення.
Використовували хешування з використанням кукурудзи в додатку, де ми мали дуже великі хеш-таблиці та виникла проблема з тиском пам'яті. Будь ласка, перегляньте мою бібліотеку eCollections за адресою http://codeplex.com/ecollections для реалізації варіанту хешування зозулі.

З повагою,


0 для відповіді № 5

Якщо я можу терпіти помилкові спрацьовування, і простір є критичним, я використовую фільтр Блум, оскільки він займає менше місця. В іншому випадку я використовую хеш.