El principio del filtro Bloom es muy simple: es tener una cadena en una tecla entera, y luego seleccionar una secuencia de bits muy larga, que comienza con 0, y cambiar 0 en esta posición a 1 en la clave; La próxima vez que entra una cadena, la clave de valor después del hash, y si el valor en este bit también es 1, significa que la cadena existe.
Si sigue el método anterior, no será diferente del algoritmo hash, y todavía hay duplicaciones del algoritmo hash.
El filtro Bloom hash una cadena en múltiples teclas, por lo que seguiré el libro.
Primero cree una constante binaria de 1.600 millones y luego establezca los 1.600 millones de bits binarios en cero. Para cada cadena, 8 generadores aleatorios diferentes (F1, F2, ..., F8) se utilizan para generar 8 huellas dactilares de información (F1, F2, ..., F8). Luego, se utiliza un generador de números aleatorios G para mapear estas ocho huellas dactilares de información a 8 números naturales G1, G2, ..., G8 en 1 a 1.600 millones. Ahora cambie todos los bits binarios en estas 8 posiciones a 1. De esta manera se construye un filtro de floración.
Entonces, ¿cómo detectar si ya existe una cadena?
Ahora use 8 generadores de números aleatorios (F1, F2, ..., F8) para generar 8 huellas dactilares de información S1, S2, ..., S8 para esta cadena, y luego corresponden estas 8 huellas dactilares de información a los 8 bits binarios del filtro de floración, a saber, T1, T2, ..., T8. Si la cadena existe, entonces obviamente los bits binarios correspondientes a T1, T2, ..., T8 deberían ser 1. Así es como determinar si ya existe una cadena.
De hecho, el filtro Bloom es una extensión del algoritmo hash. Dado que es esencialmente un hash, definitivamente habrá deficiencias. En otras palabras, definitivamente habrá juicios erróneos. No ha aparecido una cadena, pero el juicio del filtro Bloom ha aparecido. Aunque la posibilidad es muy pequeña, existe.
Entonces, ¿cómo reducir esta probabilidad? En primer lugar, se puede imaginar que si 8 huellas dactilares de información se extienden a 16 errores, la probabilidad definitivamente se reducirá, pero también debe considerarse que de esta manera, el número de cuerdas que un filtro de floración puede almacenar también se reduce 1 veces; Además, seleccione una buena función hash, y hay muchos tipos de métodos hash para cuerdas, incluidas muy buenas funciones hash.
El filtro de bronce se usa principalmente para filtrar URL maliciosas. Todas las URL maliciosas se basan en un filtro de bronce, y luego la URL accede al usuario. Si está en una URL maliciosa, el usuario será notificado. De esta manera, también podemos establecer una lista blanca para algunas URL que a menudo tienen errores en el juicio, y luego coincidir con las URL que se consideran que existen y las URL en la lista blanca. Si están en la lista blanca, serán liberados. Por supuesto, esta lista blanca no puede ser demasiado grande, ni es demasiado grande, y la probabilidad de un error de filtro de floración es muy pequeña. Los lectores interesados pueden verificar la tasa de error del filtro Bloom.
El siguiente es el código fuente de la versión Java del filtro Bloom:
import java.util.bitset; /** * * * @author xkey */public class BloomFilter {private static final int default_size = 2 << 24; // Bit Longitud del filtro Bloom privado estático finalmente int [] Seeds = {3,5,7, 11, 13, 31, 37, 61}; // El número primo aquí puede seleccionarse para reducir la tasa de errores de error muy bien bitset static bitsset = new bitset nuevo (nuevo nuevoet); static sencillo sencillo [] func = new SimpleHash [Seeds.length]; public static void addValue (valor de cadena) {for (simplyhash f: func) // hash el valor de cadena en 8 o más enteros, y luego cambia a 1 en los bits de estos enteros bits.set (f.hash (valor), verdadero); } public static void add (valor de cadena) {if (value! = null) addValue (valor); } public static boolean contiene (valor de cadena) {if (value == null) return false; boolean ret = true; Para (SimpleHash F: Func) // De hecho, no hay necesidad de ejecutarlos todos aquí. Solo ret == falso una vez, entonces la cadena no se incluirá. ret = ret && bits.get (f.hash (valor)); regresar ret; } public static void main (string [] args) {string value = "www.vevb.com"; for (int i = 0; i <sederss.length; i ++) {func [i] = new SimpleHash (default_size, Seeds [i]); } agregar (valor); System.out.println (contiene (valor)); }} clase SimpleHash {// Esta cosa es equivalente a la estructura en C ++ private int Cap; Semilla privada int; public SimpleHash (int Cap, int Seed) {this.cap = cap; this.seed = semilla; } public int hash (valor de cadena) {// stand hash, es muy importante seleccionar una buena función hash int result = 0; int len = value.length (); para (int i = 0; i <len; i ++) {resultado = semilla * resultado+value.charat (i); } return (Cap - 1) y resultado; }} Resumen: Bloom Filter es una innovación en los algoritmos de hash, y también consume muy poco espacio y tiene una baja tasa de error. En resumen, vale la pena aprender esta idea innovadora y es un uso del tipo de datos como bit.
El método de implementación de Java del filtro Bloom es todo el contenido que he compartido con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.