Алекс объяснил это довольно хорошо.Для тех, кто до сих пор не разбирался в этом, надеюсь, этот пример поможет вам понять:
Допустим, я работаю на 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 МБ. Ожидается, что этот небольшой размер, хотя и размермассива огромен, мы храним только 1 или 0, а не URL-адреса, как в случае хеш-таблицы. Этот массив можно рассматривать как битовый массив. То есть, поскольку у нас есть только два значения 1 и 0, мы можемустановите отдельные биты вместо байтов. Это уменьшит занимаемое пространство в 8 раз. Этот блум-фильтр размером 1,13 МБ из-за своего небольшого размера может храниться в самом веб-браузере !! Таким образом, когда пользователь приходит и вводит URL,мы просто применяем требуемые хеш-функции (в самом браузере) и проверяем все позиции в фильтре Блума (который хранится в браузере). Значение 0 в любой из позиций говорит нам, что этот URL НЕ ОПРЕДЕЛЕННОсписок вредоносных URL-адресов и пользователь могут свободно перемещаться. Таким образом, мы не звонили на сервер и, следовательно, сэкономили время. Значение 1 телНам нужно, чтобы URL мог быть в списке вредоносных URL.В этих случаях мы делаем вызов на удаленный сервер, и там мы можем использовать некоторую другую хеш-функцию с некоторой хеш-таблицей, как в первом случае, чтобы получить и проверить, присутствует ли URL-адрес.Поскольку в большинстве случаев URL-адрес вряд ли является вредоносным, небольшой фильтр Bloom в браузере обнаруживает это и, следовательно, экономит время, избегая обращений к удаленному серверу.Только в некоторых случаях, если фильтр Блума сообщает нам, что URL МОЖЕТ быть вредоносным, только в тех случаях мы делаем вызов на сервер.Это «могущество» на 99% верно.
Таким образом, используя небольшой фильтр Блума в браузере, мы сэкономили много времени, поскольку нам не нужно совершать серверные вызовы для каждого введенного URL-адреса.
Мы можем видеть, что хеш-таблица с одной хеш-функцией используется совсем не так, как фильтр Блума.Надеюсь, это очистит ваши сомнения :)
edit :
Я внедрил фильтр Блума для задачи злонамеренного тестирования URL в Python. Код можно найти здесь - https://github.com/tarunsharma1/Bloom-Filter
Код очень прост для понимания, подробное описание приведено в файле readme.