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