Алекс це досить добре пояснив. Для тих, хто ще не зрозумів це, сподіваємось, цей приклад допоможе вам зрозуміти:
Скажімо, я працюю в Google, в команді Chrome, і я хочу додати в браузер функцію, яка повідомляє користувача, якщо URL-адреса, яку він ввів, є шкідливою URL-адресою. Тож у мене є набір даних близько 1 мільйона шкідливих URL-адрес, розмір цього файлу - близько 25 МБ. Оскільки розмір досить великий, (великий порівняно з розміром самого браузера), я зберігаю ці дані на віддаленому сервері.
Випадок 1: Я використовую хеш-функцію з хеш-таблицею. Я вирішую ефективну функцію хешування та запускаю всі 1 мільйон URL-адрес через хеш-функцію, щоб отримати хеш-ключі. Потім я складаю хеш-таблицю (масив), де хеш-ключ дасть мені індекс для розміщення цієї URL-адреси. Отож тепер, коли я хешировав і заповнив хеш-таблицю, я перевіряю її розмір. Я зберігав усі 1 мільйон URL-адрес у хеш-таблиці разом з їх ключами. Тож розмір становить не менше 25 Мб. Ця хеш-таблиця через свій розмір буде зберігатися на віддаленому сервері. Коли користувач приходить і вводить URL-адресу в адресний рядок, мені потрібно перевірити, чи є він шкідливим. Таким чином я запускаю URL-адресу через хеш-функцію (сам браузер може це зробити), і я отримую хеш-ключ для цієї URL-адреси. Тепер я повинен зробити запит на віддалений сервер за допомогою цього хеш-ключа, перевірити, чи вказана конкретна URL-адреса в моїй хеш-таблиці з цим конкретним ключем відповідає тому, що вказав користувач. Якщо так, то це шкідливо, а якщо ні, то це не шкідливо. Таким чином, кожен раз, коли користувач вводить URL-адресу, повинен бути зроблений запит на віддалений сервер, щоб перевірити, чи це зловмисна URL-адреса. Це займе багато часу і, таким чином, зробить браузер повільним.
Випадок 2: Я використовую фільтр цвітіння. Весь список з 1 мільйона URL-адрес проходить через фільтр цвітіння за допомогою декількох хеш-функцій, а відповідні позиції позначені як 1, у величезному масиві 0. Скажімо, ми хочемо отримати помилково позитивну ставку 1%, використовуючи калькулятор фільтра цвітіння ( http://hur.st/bloomfilter?n=1000000&p=0.01), ми отримуємо необхідний розмір фільтра розпускання лише 1,13 Мбайт. Цей невеликий розмір очікується, оскільки, хоча розмір масиву величезний, ми зберігаємо лише 1s або 0s, а не URL-адреси, як у випадку з хеш-таблицею. Цей масив можна розглядати як бітовий масив. Тобто, оскільки у нас є лише два значення 1 і 0, ми можемо встановлювати окремі біти замість байтів. Це дозволило б зменшити простір, зайнятий у 8 разів. Цей фільтр для цвітіння 1,13 Мб, завдяки малому розміру, може зберігатися у самому веб-браузері !! Таким чином, коли користувач приходить і вводить URL-адресу, ми просто застосовуємо необхідні хеш-функції (у самому браузері) та перевіряємо всі позиції у фільтрі розквітання (який зберігається у браузері). Значення 0 у будь-якій з позицій говорить про те, що ця URL-адреса ВИЗНАЧЕНО НЕ в списку шкідливих URL-адрес, і користувач може вільно діяти. Таким чином, ми не телефонували на сервер, а значить, економили час. Значення 1 говорить нам, що URL-адреса МОЖЕ бути у списку шкідливих URL-адрес. У цих випадках ми здійснюємо дзвінок на віддалений сервер і там ми можемо використовувати якусь іншу хеш-функцію з якоюсь хеш-таблицею, як у першому випадку, щоб отримати та перевірити, чи справді є URL-адреса. Оскільки в більшості випадків URL-адреса, мабуть, не є шкідливою, малий фільтр цвітіння у веб-переглядачі показує, що це і, отже, економить час, уникаючи дзвінків на віддалений сервер. Лише в деяких випадках, якщо фільтр цвітіння повідомляє нам, що URL-адреса МОЖЕ бути зловмисною, лише в цих випадках ми здійснюємо дзвінок на сервер. Це "МОЖЕ" на 99%. У цих випадках ми здійснюємо дзвінок на віддалений сервер і там ми можемо використовувати якусь іншу хеш-функцію з якоюсь хеш-таблицею, як у першому випадку, щоб отримати та перевірити, чи справді є URL-адреса. Оскільки в більшості випадків URL-адреса, мабуть, не є шкідливою, малий фільтр цвітіння у веб-переглядачі показує, що це і, отже, економить час, уникаючи дзвінків на віддалений сервер. Лише в деяких випадках, якщо фільтр цвітіння повідомляє нам, що URL-адреса МОЖЕ бути шкідливою, лише в тих випадках ми здійснюємо дзвінок на сервер. Це "МОЖЕ" на 99%. У цих випадках ми здійснюємо дзвінок на віддалений сервер і там ми можемо використовувати якусь іншу хеш-функцію з якоюсь хеш-таблицею, як у першому випадку, щоб отримати та перевірити, чи справді є URL-адреса. Оскільки в більшості випадків URL-адреса, мабуть, не є шкідливою, малий фільтр цвітіння у веб-переглядачі показує, що це і, отже, економить час, уникаючи дзвінків на віддалений сервер. Лише в деяких випадках, якщо фільтр цвітіння повідомляє нам, що URL-адреса МОЖЕ бути зловмисною, лише в цих випадках ми здійснюємо дзвінок на сервер. Це "МОЖЕ" на 99%. малий фільтр цвітіння у веб-переглядачі показує, що це дозволяє економити час, уникаючи дзвінків на віддалений сервер. Лише в деяких випадках, якщо фільтр цвітіння повідомляє нам, що URL-адреса МОЖЕ бути зловмисною, лише в цих випадках ми здійснюємо дзвінок на сервер. Це "МОЖЕ" на 99%. малий фільтр цвітіння у веб-переглядачі показує, що це дозволяє економити час, уникаючи дзвінків на віддалений сервер. Лише в деяких випадках, якщо фільтр цвітіння повідомляє нам, що URL-адреса МОЖЕ бути зловмисною, лише в цих випадках ми здійснюємо дзвінок на сервер. Це "МОЖЕ" на 99%.
Таким чином, використовуючи невеликий фільтр цвітіння у браузері, ми заощадили багато часу, оскільки нам не потрібно здійснювати дзвінки на сервер за кожною введеною URL-адресою.
Ми можемо бачити, що хеш-таблиця з однією хеш-функцією використовується взагалі з іншою метою, ніж фільтр розквітання. Сподіваємось, це знімає ваші сумніви :)
редагувати :
Я реалізував фільтр цвітіння для завдання тестування на шкідливі URL-адреси в Python. Код можна знайти тут - https://github.com/tarunsharma1/Bloom-Filter
Код зрозуміти дуже просто, детальний опис надається у файлі readme.