Принцип фильтра цветов очень прост: он состоит в том, чтобы хэшировать строку в целочисленном ключ, а затем выберите очень длинную битовую последовательность, которая начинается с 0, и изменить 0 в этой позиции на 1 в ключ; В следующий раз, когда появляется строка, ключ значения после хэша, и если значение на этом бите также составляет 1, это означает, что строка существует.
Если вы будете следовать вышеуказанному методу, он ничем не отличается от алгоритма хэш, и все еще существуют дупликацию хэш -алгоритма.
Фильтр Bloom хеша в строку в нескольких ключах, поэтому мне лучше следовать книге.
Сначала создайте бинарную константу 1,6 миллиарда, а затем установите все 1,6 миллиарда бинарных битов на ноль. Для каждой строки 8 различных случайных генераторов (F1, F2, ..., F8) используются для генерации 8 информационных отпечатков пальцев (F1, F2, ..., F8). Затем генератор случайных чисел используется для сопоставления этих восьми информационных отпечатков пальцев до 8 натуральных чисел G1, G2, ..., G8 в 1-1,6 млрд. Теперь измените все бинарные биты в этих 8 позициях на 1. Таким образом, построен фильтр цветов.
Так как определить, существует ли строка уже?
Теперь используйте 8 генераторов случайных чисел (F1, F2, ..., F8), чтобы генерировать 8 информационных отпечатков пальцев S1, S2, ..., S8 для этой строки, а затем соответствуют этим 8 информационным отпечаткам пальцами 8 двоичных битов фильтра цветения, а также T1, T2, ..., T8. Если строка существует, то, очевидно, бинарные биты, соответствующие T1, T2, ..., T8 должны быть 1. Так определить, существует ли строка уже.
Фактически, фильтр цветов является расширением хэш -алгоритма. Поскольку это по сути хэш, определенно будут недостатки. Другими словами, определенно будут ошибки. Строка не появилась, но появилось решение фильтра «Блум». Хотя возможность очень мала, она существует.
Так как же уменьшить эту вероятность? Прежде всего, можно себе представить, что если 8 информационных отпечатков пальцев расширяются до 16 ошибок, вероятность определенно будет уменьшена, но также следует учитывать, что таким образом количество строк, которые может хранить фильтр цветения, также уменьшается в 1 раза; Кроме того, выберите хорошую хэш -функцию, и существует множество типов хэш -методов для строк, включая очень хорошие хэш -функции.
Бронзовый фильтр в основном используется для фильтрации вредоносных URL -адресов. Все вредоносные URL -адреса построены на бронзовом фильтре, а затем пользователь обращается к URL. Если он находится в злонамеренном URL, пользователь будет уведомлен. Таким образом, мы также можем установить белый список для некоторых URL -адресов, которые часто имеют ошибки в суждении, а затем соответствовать URL -адресам, которые, по мнению существования, и URL -адреса в белом списке. Если они находятся в белом списке, они будут освобождены. Конечно, этот белый список не может быть слишком большим, и он не слишком большой, и вероятность ошибки фильтра цветения очень мала. Заинтересованные читатели могут проверить частоту ошибок фильтра Bloom.
Ниже приведен исходный код версии Bloom Filter Java:
импортировать java.util.bitset; /** * * @author xkey */public class bloomfilter {private static final int default_size = 2 << 24; // Длина бита плавного фильтра Private Static Final int [] SEEDS = {3,5,7, 11, 13, 31, 37, 61}; // Основное число здесь может быть выбран, чтобы уменьшить частоту ошибок, неплохо, неплохо, неплохо, неплохо, неплохо, неплохое, но нашибает. частный статический простой хранение [] func = new SimpleHash [Seeds.length]; public static void AddValue (строковое значение) {for (simpleHash f: func) // Хэш строкового значения в 8 или более целых числа, а затем изменить на 1 на битах этих целых чисел bits.set (f.hash (value), true); } public static void add (строка значения) {if (value! = null) addValue (value); } public static boolean содержит (строковое значение) {if (value == null) return false; логический ret = true; Для (SimpleHash F: Func) // На самом деле нет необходимости запускать их все здесь. Просто ret == Неверно один раз, тогда строка не будет включена. ret = ret && bits.get (f.hash (value)); вернуть вт; } public static void main (string [] args) {string value = "www.vevb.com"; for (int i = 0; i <seeds.length; i ++) {func [i] = new Simplehash (default_size, Seeds [i]); } add (value); System.out.println (содержит (значение)); }} класс SimpleHash {// Эта вещь эквивалентна структуре в C ++ Private Int Cap; частное семя; public simplehash (int cap, int seed) {this.cap = cap; this.seed = seed; } public int hash (строка значения) {// stand hash, очень важно выбрать хорошую хэш -функцию int result = 0; int len = value.length (); for (int i = 0; i <len; i ++) {result = seed * result+value.charat (i); } return (cap - 1) и результат; }} Резюме: Bloom Filter - это инновация в алгоритмах хэширования, и он требует очень мало места и имеет низкий уровень ошибок. Короче говоря, эта инновационная идея стоит изучать и использует тип данных, как бит.
Метод реализации Java фильтра Bloom - это весь контент, которым я поделился с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.