Articulo de referencia

Filtro Bloom

En informática , un filtro de Bloom es una estructura de datos probabilística de uso eficiente del espacio , concebida por Burton Howard Bloom en 1970, que se utiliza para compr...

En informática , un filtro de Bloom es una estructura de datos probabilística de uso eficiente del espacio , concebida por Burton Howard Bloom en 1970, que se utiliza para comprobar si un elemento pertenece a un conjunto . Son posibles los falsos positivos , pero no los falsos negativos ; en otras palabras, una consulta devuelve "posiblemente en el conjunto" o "definitivamente no en el conjunto". Se pueden añadir elementos al conjunto, pero no eliminarlos (aunque esto se puede solucionar con la variante de filtro de Bloom de conteo ); cuantos más elementos se añadan, mayor será la probabilidad de falsos positivos.

Bloom propuso la técnica para aplicaciones donde la cantidad de datos de origen requeriría una cantidad de memoria impracticablemente grande si se aplicaran técnicas de hash sin errores "convencionales" . Dio el ejemplo de un algoritmo de división de palabras para un diccionario de 500 000 palabras, de las cuales el 90 % sigue reglas de división de palabras simples, pero el 10 % restante requiere costosos accesos al disco para recuperar patrones de división de palabras específicos. Con suficiente memoria , se podría usar un hash sin errores para eliminar todos los accesos innecesarios al disco; por otro lado, con memoria limitada, la técnica de Bloom usa un área de hash más pequeña, pero aun así elimina la mayoría de los accesos innecesarios. Por ejemplo, un área de hash que solo representa el 18 % del tamaño necesario para un hash sin errores ideal aún elimina el 87 % de los accesos al disco. [ 1 ]

En términos más generales, se requieren menos de 10 bits por elemento para una probabilidad de falso positivo del 1%, independientemente del tamaño o número de elementos en el conjunto. [ 2 ]

Descripción del algoritmo

Un ejemplo de filtro de Bloom, que representa el conjunto { x , y , z } . Las flechas de colores muestran las posiciones en la matriz de bits a las que se asigna cada elemento del conjunto. El elemento w no está en el conjunto { x , y , z } , porque su función hash se corresponde con una posición de la matriz de bits que contiene 0. Para esta figura, m  = 18 y k  = 3 .

Un filtro Bloom vacío es una matriz de m bits, todos a 0. Está equipado con k funciones hash diferentes , que asignan los elementos del conjunto a una de las m posiciones posibles de la matriz. Para que sea óptimo, las funciones hash deben estar distribuidas uniformemente y ser independientes . Normalmente, k es una pequeña constante que depende de la tasa de falsos positivos deseada ε , mientras que m es proporcional a k y al número de elementos que se van a añadir.

Para agregar un elemento, páselo a cada una de las k funciones hash para obtener k posiciones en el array. Establezca los bits en todas estas posiciones a 1.

Para comprobar si un elemento pertenece al conjunto, se introduce en cada una de las k funciones hash para obtener k posiciones en el array. Si alguno de los bits en estas posiciones es 0, el elemento definitivamente no pertenece al conjunto; si lo perteneciera, todos los bits se habrían establecido en 1 al insertarlo. Si todos son 1, entonces o bien el elemento pertenece al conjunto, o bien los bits se han establecido en 1 por casualidad durante la inserción de otros elementos, lo que resulta en un falso positivo . En un filtro Bloom simple, no hay forma de distinguir entre ambos casos, pero técnicas más avanzadas pueden solucionar este problema.

El requisito de diseñar k funciones hash independientes diferentes puede resultar prohibitivo para valores grandes de k . Para una buena función hash con una salida amplia, debería existir poca o ninguna correlación entre los diferentes campos de bits de dicha función, por lo que este tipo de hash puede utilizarse para generar múltiples funciones hash "diferentes" dividiendo su salida en múltiples campos de bits. Alternativamente, se pueden pasar k valores iniciales diferentes (como 0, 1, ..., k 1) a una función hash que acepte un valor inicial; o bien, añadir (o concatenar) estos valores a la clave. Para valores mayores de m y/o k , la independencia entre las funciones hash puede relajarse con un aumento insignificante en la tasa de falsos positivos. [ 3 ] (En concreto, Dillinger y Manolios (2004b) demuestran la eficacia de derivar los índices k utilizando el doble hash mejorado y el triple hash , variantes del doble hash que son, en la práctica, generadores de números aleatorios simples inicializados con los dos o tres valores hash).  

Eliminar un elemento de este sencillo filtro de Bloom es imposible porque no hay forma de saber cuál de los k bits a los que se asigna debe borrarse. Si bien basta con poner a cero cualquiera de esos k bits para eliminar el elemento, también se eliminarían otros elementos que se asignen a ese bit. Dado que el sencillo algoritmo no permite determinar si se han añadido otros elementos que afecten a los bits del elemento que se va a eliminar, borrar cualquiera de ellos introduciría la posibilidad de falsos negativos.

La eliminación puntual de un elemento de un filtro Bloom se puede simular mediante un segundo filtro que contenga los elementos eliminados. Sin embargo, los falsos positivos en el segundo filtro se convierten en falsos negativos en el filtro compuesto, lo cual puede resultar indeseable. Con este método, no es posible volver a añadir un elemento previamente eliminado, ya que habría que eliminarlo del filtro de elementos eliminados.

A menudo, todas las claves están disponibles, pero su enumeración resulta costosa (por ejemplo, requiere numerosas lecturas de disco). Cuando la tasa de falsos positivos es demasiado alta, se puede regenerar el filtro; esto debería ocurrir con relativa poca frecuencia.

Ventajas de espacio y tiempo

El filtro de Bloom se utiliza para acelerar las respuestas en un sistema de almacenamiento clave-valor. Los valores se almacenan en un disco con tiempos de acceso lentos. Las decisiones del filtro de Bloom son mucho más rápidas. Sin embargo, se producen algunos accesos innecesarios al disco cuando el filtro informa de un resultado positivo (para eliminar los falsos positivos). En general, la velocidad de respuesta es mejor con el filtro de Bloom que sin él. No obstante, el uso de un filtro de Bloom para este fin aumenta el consumo de memoria.

Aunque conllevan el riesgo de falsos positivos, los filtros de Bloom ofrecen una ventaja espacial considerable respecto a otras estructuras de datos para la representación de conjuntos, como árboles de búsqueda binaria autoequilibrados , tries , tablas hash o simples arreglos o listas enlazadas de las entradas. La mayoría de estas requieren almacenar al menos los propios elementos de datos, lo que puede suponer desde un número reducido de bits, para enteros pequeños, hasta un número arbitrario de bits, como en el caso de cadenas ( los tries son una excepción, ya que pueden compartir almacenamiento entre elementos con prefijos iguales). Sin embargo, los filtros de Bloom no almacenan los elementos de datos, por lo que se debe proporcionar una solución independiente para su almacenamiento. Las estructuras enlazadas conllevan una sobrecarga espacial lineal adicional debido a los punteros. Un filtro de Bloom con un error del 1 % y un valor óptimo de k , en cambio, requiere solo unos 9,6 bits por elemento, independientemente del tamaño de los elementos. Esta ventaja se debe en parte a su compacidad, heredada de los arreglos, y en parte a su naturaleza probabilística. La tasa de falsos positivos del 1% se puede reducir en un factor de diez añadiendo tan solo unos 4,8 bits por elemento.

Sin embargo, si el número de valores potenciales es pequeño y muchos de ellos pueden estar en el conjunto, el filtro de Bloom es fácilmente superado por la matriz de bits determinista , que requiere solo un bit para cada elemento potencial. Las tablas hash obtienen una ventaja en espacio y tiempo si comienzan a ignorar las colisiones y almacenan solo si cada cubeta contiene una entrada; en este caso, se han convertido efectivamente en filtros de Bloom con k = 1. [ 4 ]

Los filtros de Bloom también poseen la peculiaridad de que el tiempo necesario para añadir elementos o comprobar si un elemento pertenece al conjunto es una constante fija, O( k ) , totalmente independiente del número de elementos que ya contiene. Ninguna otra estructura de datos de conjunto de espacio constante presenta esta propiedad, pero el tiempo de acceso promedio de las tablas hash dispersas puede hacerlas más rápidas en la práctica que algunos filtros de Bloom. Sin embargo, en una implementación de hardware, el filtro de Bloom destaca porque sus k búsquedas son independientes y pueden paralelizarse.

Para comprender su eficiencia espacial, es instructivo comparar el filtro de Bloom general con su caso especial cuando k = 1. Si k = 1 , para mantener la tasa de falsos positivos suficientemente baja, se debe establecer una pequeña fracción de bits, lo que significa que el arreglo debe ser muy grande y contener largas secuencias de ceros. El contenido de información del arreglo en relación con su tamaño es bajo. El filtro de Bloom generalizado ( k mayor que 1) permite establecer muchos más bits manteniendo una baja tasa de falsos positivos; si los parámetros ( k y m ) se eligen bien, aproximadamente la mitad de los bits se establecerán, [ 5 ] y estos serán aparentemente aleatorios, minimizando la redundancia y maximizando el contenido de información.

Probabilidad de falsos positivos

La probabilidad de falso positivo p es una función del número de elementos n en el filtro y del tamaño del filtro m . Se ha asumido un número óptimo de funciones hash k = ( m / n ) ln 2 .

Supongamos que una función hash selecciona cada posición del array con igual probabilidad. Si m es el número de bits del array, la probabilidad de que un determinado bit no se establezca en 1 por una determinada función hash durante la inserción de un elemento es

11metro.{\displaystyle 1-{\frac {1}{m}}.}

Si k es el número de funciones hash y cada una no tiene una correlación significativa entre sí, entonces la probabilidad de que el bit no esté establecido en 1 por ninguna de las funciones hash es

(11metro)k.{\displaystyle \left(1-{\frac {1}{m}}\right)^{k}.}

Podemos utilizar la identidad bien conocida para e 1

límitemetro(11metro)metro=1mi{\displaystyle \lim _{m\to \infty }\left(1-{\frac {1}{m}}\right)^{m}={\frac {1}{e}}}

para concluir que, para m grande ,

(11metro)k=((11metro)metro)k/metromik/metro.{\displaystyle \left(1-{\frac {1}{m}}\right)^{k}=\left(\left(1-{\frac {1}{m}}\right)^{m}\right)^{k/m}\approx e^{-k/m}.}

Si hemos insertado n elementos, la probabilidad de que un determinado bit siga siendo 0 es

(11metro)knortemiknorte/metro;{\displaystyle \left(1-{\frac {1}{m}}\right)^{kn}\approx e^{-kn/m};}

la probabilidad de que sea 1 es, por lo tanto

1(11metro)knorte1miknorte/metro.{\displaystyle 1-\left(1-{\frac {1}{m}}\right)^{kn}\approx 1-e^{-kn/m}.}

Ahora comprobemos la pertenencia de un elemento que no está en el conjunto. Cada una de las k posiciones de la matriz calculadas por las funciones hash es 1 con una probabilidad como la anterior. La probabilidad de que todas sean 1, lo que haría que el algoritmo afirmara erróneamente que el elemento está en el conjunto, se suele dar como

ε=(1[11metro]knorte)k(1miknorte/metro)k.{\displaystyle \varepsilon =\left(1-\left[1-{\frac {1}{m}}\right]^{kn}\right)^{k}\approx \left(1-e^{-kn/m}\right)^{k}.}

Esto no es del todo correcto, ya que presupone independencia en las probabilidades de que cada bit esté activado. Sin embargo, si se trata de una aproximación cercana, tenemos que la probabilidad de falsos positivos disminuye a medida que m (el número de bits en el array) aumenta, y aumenta a medida que n (el número de elementos insertados) aumenta.

La verdadera probabilidad de un falso positivo, sin asumir independencia, es

1metrok(norte+1)i=1metroiki¡(metroi){knortei}{\displaystyle {\frac {1}{m^{k(n+1)}}}\sum _{i=1}^{m}i^{k}i!{m \choose i}\left\{{kn \atop i}\right\}}

donde las {corchetes} denotan números de Stirling de segundo tipo . [ 6 ]

Mitzenmacher y Upfal proporcionan un análisis alternativo que llega a la misma aproximación sin la suposición de independencia. [ 7 ] Después de que se hayan agregado todos los n elementos al filtro de Bloom, sea q la fracción de los m bits que se establecen en 0. (Es decir, el número de bits que aún se establecen en 0 es qm .) Entonces, al probar la pertenencia de un elemento que no está en el conjunto, para la posición de la matriz dada por cualquiera de las k funciones hash, la probabilidad de que el bit se encuentre establecido en 1 es1q{\displaystyle 1-q}. Por lo tanto, la probabilidad de que todas las k funciones hash encuentren su bit establecido en 1 es(1q)k{\displaystyle (1-q)^{k}}Además , el valor esperado de q es la probabilidad de que una posición dada de la matriz quede sin tocar por cada una de las k funciones hash para cada uno de los n elementos, que es (como se indicó anteriormente)

mi[q]=(11metro)knorte{\displaystyle E[q]=\left(1-{\frac {1}{m}}\right)^{kn}}.

Es posible demostrar, sin la suposición de independencia, que q está muy fuertemente concentrado alrededor de su valor esperado. En particular, a partir de la desigualdad de Azuma-Hoeffding , demuestran que [ 8 ]

Pr(|qmi[q]|λmetro)2exp(2λ2/knorte){\displaystyle \Pr(\left|qE[q]\right|\geq {\frac {\lambda }{m}})\leq 2\exp(-2\lambda ^{2}/kn)}

Por ello, podemos decir que la probabilidad exacta de falsos positivos es

tPr(q=t)(1t)k(1mi[q])k=(1[11metro]knorte)k(1miknorte/metro)k{\displaystyle \sum _{t}\Pr(q=t)(1-t)^{k}\approx (1-E[q])^{k}=\left(1-\left[1-{\frac {1}{m}}\right]^{kn}\right)^{k}\approx \left(1-e^{-kn/m}\right)^{k}}

como antes.

Número óptimo de funciones hash

El número de funciones hash, k , debe ser un entero positivo. Dejando de lado esta restricción, para un m y n dados , el valor de k que minimiza la probabilidad de falso positivo es

k=metronorteln2.{\displaystyle k={\frac {m}{n}}\ln 2.}

El número de bits requerido, m , dado n (el número de elementos insertados) y una probabilidad de falso positivo deseada ε (y suponiendo que se utiliza el valor óptimo de k ) se puede calcular sustituyendo el valor óptimo de k en la expresión de probabilidad anterior:

ε=(1mi(metronorteln2)nortemetro)metronorteln2=(12)metronorteln2{\displaystyle \varepsilon =\left(1-e^{-({\frac {m}{n}}\ln 2){\frac {n}{m}}}\right)^{{\frac {m}{n}}\ln 2}=\left({\frac {1}{2}}\right)^{{\frac {m}{n}}\ln 2}}

que se puede simplificar a:

ln(ε)=metronorteln(2)2.{\displaystyle \ln(\varepsilon )=-{\frac {m}{n}}\ln(2)^{2}.}

Esto da como resultado:

metro=norteln(ε)ln(2)2{\displaystyle m=-{\frac {n\ln(\varepsilon )}{\ln(2)^{2}}}}

Por lo tanto, el número óptimo de bits por elemento es

metronorte=ln(ε)ln(2)22.08ln(ε){\displaystyle {\frac {m}{n}}=-{\frac {\ln(\varepsilon )}{\ln(2)^{2}}}\approx -2.08\ln(\varepsilon )}

con el número correspondiente de funciones hash k (ignorando la integralidad):

k=ln(ε)ln(2).{\displaystyle k=-{\frac {\ln(\varepsilon )}{\ln(2)}}.}

Esto significa que para una probabilidad de falso positivo dada ε , la longitud de un filtro Bloom m es proporcional al número de elementos que se filtran n y el número requerido de funciones hash solo depende de la probabilidad de falso positivo objetivo ε . [ 9 ]

La fórmulametro=nortelnε(ln2)2{\displaystyle m=-{\frac {n\ln \varepsilon }{(\ln 2)^{2}}}}es aproximado por tres razones. Primero, y lo que menos preocupa, se aproxima a 11metro{\displaystyle 1-{\frac {1}{m}}}comomi1metro{\displaystyle e^{-{\frac {1}{m}}}}, que es una buena aproximación asintótica (es decir, que se cumple cuando m →∞). En segundo lugar, y lo que es más preocupante, supone que durante la prueba de pertenencia el evento de que un bit probado se establezca en 1 es independiente del evento de que cualquier otro bit probado se establezca en 1. En tercer lugar, y lo que es más preocupante, supone quek=metronorteln2{\displaystyle k={\frac {m}{n}}\ln 2}es fortuitamente integral.

Goel y Gupta, [ 10 ] sin embargo, dan una cota superior rigurosa que no hace aproximaciones y no requiere suposiciones. Demuestran que la probabilidad de falso positivo para un filtro Bloom finito con m bits (metro>1{\displaystyle m>1}), n elementos y k funciones hash es como máximo

ε(1mik(norte+0,5)metro1)k.{\displaystyle \varepsilon \leq \left(1-e^{-{\frac {k(n+0.5)}{m-1}}}\right)^{k}.}

Este límite puede interpretarse como que la fórmula aproximada(1miknortemetro)k{\displaystyle \left(1-e^{-{\frac {kn}{m}}}\right)^{k}}se puede aplicar con una penalización de como máximo medio elemento adicional y como máximo un bit menos.

Aproximación del número de elementos en un filtro de Bloom

El número de elementos en un filtro Bloom se puede aproximar con la siguiente fórmula:

norte=metrokln[1incógnitametro],{\displaystyle n^{*}=-{\frac {m}{k}}\ln \left[1-{\frac {X}{m}}\right],}

dóndenorte{\displaystyle n^{*}}es una estimación del número de elementos en el filtro, m es la longitud (tamaño) del filtro, k es el número de funciones hash y X es el número de bits establecidos a uno. [ 11 ]

La unión e intersección de conjuntos

Los filtros de Bloom son una forma de representar de manera compacta un conjunto de elementos. Es común intentar calcular el tamaño de la intersección o unión entre dos conjuntos. Los filtros de Bloom se pueden usar para aproximar el tamaño de la intersección y unión de dos conjuntos. Para dos filtros de Bloom de longitud m , sus recuentos, respectivamente, se pueden estimar como

norte(A)=metrokln[1|A|metro]{\displaystyle n(A^{*})=-{\frac {m}{k}}\ln \left[1-{\frac {|A|}{m}}\right]}

y

norte(B)=metrokln[1|B|metro].{\displaystyle n(B^{*})=-{\frac {m}{k}}\ln \left[1-{\frac {|B|}{m}}\right].}

El tamaño de su unión se puede estimar como

norte(AB)=metrokln[1|AB|metro],{\displaystyle n(A^{*}\cup B^{*})=-{\frac {m}{k}}\ln \left[1-{\frac {|A\cup B|}{m}}\right],}

dóndenorte(AB){\displaystyle n(A\cup B)}es el número de bits establecidos a uno en cualquiera de los dos filtros de Bloom. Finalmente, la intersección se puede estimar como

norte(AB)=norte(A)+norte(B)norte(AB),{\displaystyle n(A^{*}\cap B^{*})=n(A^{*})+n(B^{*})-n(A^{*}\cup B^{*}),}

using the three formulas together.[11]

Properties

  • Unlike a standard hash table using open addressing for collision resolution, a Bloom filter of a fixed size can represent a set with an arbitrarily large number of elements; adding an element never fails due to the data structure "filling up". However, the false positive rate increases steadily as elements are added until all bits in the filter are set to 1, at which point all queries yield a positive result. With open addressing hashing, false positives are never produced, but performance steadily deteriorates until it approaches linear search.
  • Union and intersection of Bloom filters with the same size and set of hash functions can be implemented with bitwise OR and AND operations, respectively. The union operation on Bloom filters is lossless in the sense that the resulting Bloom filter is the same as the Bloom filter created from scratch using the union of the two sets. The intersect operation satisfies a weaker property: the false positive probability in the resulting Bloom filter is at most the false-positive probability in one of the constituent Bloom filters, but may be larger than the false positive probability in the Bloom filter created from scratch using the intersection of the two sets.
  • Some kinds of superimposed code can be seen as a Bloom filter implemented with physical edge-notched cards. An example is Zatocoding, invented by Calvin Mooers in 1947, in which the set of categories associated with a piece of information is represented by notches on a card, with a random pattern of four notches for each category.

Examples

  • Fruit flies use a mechanism similar to Bloom filters to detect novelty of odors, with the primary differences being stateful tests such as similarity of an odor to that of previously experienced odors or time elapsed since previous experience of the same odor.[12]
  • The servers of Akamai Technologies, a content delivery provider, use Bloom filters to prevent "one-hit-wonders" from being stored in its disk caches. One-hit-wonders are web objects requested by users just once, something that Akamai found applied to nearly three-quarters of their caching infrastructure. Using a Bloom filter to detect the second request for a web object and caching that object only on its second request prevents one-hit wonders from entering the disk cache, significantly reducing disk workload and increasing disk cache hit rates.[13]
  • Google Bigtable , Apache HBase , Apache Cassandra , ScyllaDB y PostgreSQL [ 14 ] utilizan filtros Bloom para reducir las búsquedas en disco de filas o columnas inexistentes. Evitar búsquedas costosas en disco aumenta considerablemente el rendimiento de una operación de consulta de base de datos. [ 15 ]
  • El navegador web Google Chrome utilizaba anteriormente un filtro Bloom para identificar URL maliciosas . Cada URL se comprobaba primero con un filtro Bloom local, y solo si este arrojaba un resultado positivo se realizaba una comprobación completa de la URL (y se advertía al usuario si también se obtenía un resultado positivo). [ 16 ] [ 17 ]
  • Mozilla Firefox utiliza filtros Bloom en cascada para la revocación de certificados [ 18 ] [ 19 ] y para bloquear complementos maliciosos. [ 20 ]
  • Microsoft Bing (motor de búsqueda) utiliza filtros Bloom jerárquicos multinivel para su índice de búsqueda, BitFunnel . Los filtros Bloom proporcionaron un costo menor que el índice Bing anterior, que se basaba en archivos invertidos . [ 21 ]
  • La caché del proxy web Squid utiliza filtros Bloom para los resúmenes de caché. [ 22 ]
  • Bitcoin utilizó filtros Bloom para acelerar la sincronización de la billetera hasta que se descubrieron vulnerabilidades de privacidad en la implementación de los filtros Bloom. [ 23 ]
  • El sistema de almacenamiento de archivos Venti utiliza filtros Bloom para detectar datos almacenados previamente. [ 24 ]
  • El verificador de modelos SPIN utiliza filtros de Bloom para rastrear el espacio de estados alcanzables para problemas de verificación grandes. [ 25 ]
  • El marco de análisis en cascada utiliza filtros de Bloom para acelerar las uniones asimétricas, donde uno de los conjuntos de datos unidos es significativamente mayor que el otro (a menudo llamado unión de Bloom en la literatura de bases de datos). [ 26 ]
  • El agente de transferencia de correo (MTA) de Exim utiliza filtros Bloom en su función de limitación de velocidad.
  • Medium utiliza filtros Bloom para evitar recomendar artículos que un usuario haya leído previamente. [ 27 ]
  • Ethereum utiliza filtros Bloom para encontrar rápidamente registros en la cadena de bloques de Ethereum .
  • Grafana Tempo utiliza filtros Bloom para mejorar el rendimiento de las consultas almacenando filtros Bloom para cada bloque del backend. Se accede a estos en cada consulta para determinar los bloques que contienen datos que cumplen con los criterios de búsqueda proporcionados [ 28 ].

Alternativas

Los filtros Bloom clásicos utilizan1.44registro2(1/ε){\displaystyle 1.44\log _{2}(1/\varepsilon )}bits de espacio por tecla insertada, dondeε{\displaystyle \varepsilon }es la tasa de falsos positivos del filtro de Bloom. Sin embargo, el espacio que es estrictamente necesario para cualquier estructura de datos que desempeñe el mismo papel que un filtro de Bloom es soloregistro2(1/ε){\displaystyle \log _{2}(1/\varepsilon )}por clave. [ 29 ] Por lo tanto, los filtros de Bloom utilizan un 44 % más de espacio que una estructura de datos óptima equivalente.

Pagh et al. proporcionan una estructura de datos que utiliza(1+o(1))norteregistro2(1/ϵ)+O(norte){\textstyle (1+o(1))n\log _{2}(1/\epsilon )+O(n)}bits mientras admite operaciones de tiempo esperado amortizado constante. [ 30 ] Su estructura de datos es principalmente teórica, pero está estrechamente relacionada con el filtro de cociente ampliamente utilizado , que puede parametrizarse para usar(1+δ)norteregistroϵ1+3norte{\displaystyle (1+\delta )n\log \epsilon ^{-1}+3n}bits de espacio, para un parámetro arbitrarioδ>0{\displaystyle \delta >0}, mientras apoyabaO(δ2){\displaystyle O(\delta ^{-2})}-operaciones de tiempo. [ 31 ] Las ventajas del filtro de cociente, en comparación con el filtro de Bloom, incluyen su localidad de referencia y la capacidad de admitir eliminaciones.

Otra alternativa al filtro Bloom clásico es el filtro cuco , basado en variantes de hashing cuco que optimizan el uso del espacio . En este caso, se construye una tabla hash que no almacena ni claves ni valores, sino huellas digitales cortas (hashes pequeños) de las claves. Si al buscar la clave se encuentra una huella digital coincidente, entonces es probable que la clave esté en el conjunto. Los filtros cuco admiten eliminaciones y tienen una mejor localidad de referencia que los filtros Bloom. [ 32 ] Además, en ciertos regímenes de parámetros, los filtros cuco pueden parametrizarse para ofrecer garantías de espacio casi óptimas. [ 32 ]

Muchas alternativas a los filtros de Bloom, incluidos los filtros de cociente y los filtros de cuco , se basan en la idea de aplicar funciones hash a las claves para generar números aleatorios.(registronorte+registroϵ1){\displaystyle (\log n+\log \epsilon ^{-1})}huellas digitales de bits y luego almacenar esas huellas digitales en una tabla hash compacta. Esta técnica, que fue introducida por primera vez por Carter et al. en 1978, [ 29 ] se basa en el hecho de que las tablas hash compactas se pueden implementar para usar aproximadamentenorteregistronorte{\displaystyle n\log n}bits menos espacio que sus contrapartes no compactas. Usando tablas hash concisas , el uso de espacio se puede reducir a tan solonorteregistro2(mi/ϵ)+o(norte){\displaystyle n\log _{2}(e/\epsilon )+o(n)}bits [ 33 ] al tiempo que admite operaciones de tiempo constante en una amplia variedad de regímenes de parámetros.

Putze, Sanders y Singler (2007) estudiaron algunas variantes de filtros Bloom que son más rápidas o utilizan menos espacio que los filtros Bloom clásicos. La idea básica de la variante rápida es ubicar los k valores hash asociados a cada clave en uno o dos bloques del mismo tamaño que los bloques de caché de memoria del procesador (generalmente 64 bytes). Esto presumiblemente mejorará el rendimiento al reducir el número de posibles fallos de caché de memoria . Sin embargo, las variantes propuestas tienen el inconveniente de utilizar aproximadamente un 32 % más de espacio que los filtros Bloom clásicos.

La variante eficiente en espacio se basa en el uso de una única función hash que genera para cada clave un valor en el rango[0,norte/ε]{\displaystyle \left[0,n/\varepsilon \right]}dóndeε{\displaystyle \varepsilon }es la tasa de falsos positivos solicitada. La secuencia de valores se ordena y comprime utilizando codificación Golomb (o alguna otra técnica de compresión) para ocupar un espacio cercano anorteregistro2(1/ε){\displaystyle n\log _{2}(1/\varepsilon )}Para consultar el filtro Bloom con una clave determinada, basta con comprobar si su valor correspondiente está almacenado en él. Descomprimir todo el filtro Bloom para cada consulta haría que esta variante fuera totalmente inutilizable. Para solucionar este problema, la secuencia de valores se divide en pequeños bloques de igual tamaño que se comprimen por separado. En el momento de la consulta, solo será necesario descomprimir la mitad de un bloque, en promedio. Debido a la sobrecarga de la descompresión, esta variante puede ser más lenta que los filtros Bloom clásicos, pero esto se compensa con el hecho de que solo se necesita calcular una función hash.

Graf y Lemire (2020) describen un enfoque llamado filtro xor , donde almacenan huellas digitales en un tipo particular de tabla hash perfecta , produciendo un filtro que es más eficiente en memoria (1.23registro2(1/ε){\displaystyle 1.23\log _{2}(1/\varepsilon )}bits por clave) y más rápido que los filtros Bloom o Cuckoo. (El ahorro de tiempo se debe a que una búsqueda requiere exactamente tres accesos a memoria, que pueden ejecutarse en paralelo). Sin embargo, la creación de filtros es más compleja que la de los filtros Bloom y Cuckoo, y no es posible modificar el conjunto después de su creación.

Extensiones y aplicaciones

Existen más de 60 variantes de filtros de Bloom, numerosos estudios del campo y un flujo constante de aplicaciones (véase, por ejemplo, Luo, et al [ 34 ] ). Algunas de las variantes difieren lo suficiente de la propuesta original como para constituir desviaciones o bifurcaciones de la estructura de datos original y su filosofía. [ 34 ] Aún queda por realizar un tratamiento que unifique los filtros de Bloom con otros trabajos sobre proyecciones aleatorias , detección compresiva y hashing sensible a la localidad (aunque véase Dasgupta, et al [ 35 ] para un intento inspirado en la neurociencia).

Filtrado de caché

El uso de un filtro Bloom para evitar que los eventos de un solo impacto se almacenen en una caché web redujo la tasa de escrituras en disco a casi la mitad, lo que redujo la carga en los discos y potencialmente aumentó el rendimiento del disco. [ 13 ]

Las redes de distribución de contenido (CDN) implementan cachés web en todo el mundo para almacenar y servir contenido web a los usuarios con mayor rendimiento y fiabilidad. Una aplicación clave de los filtros Bloom es su uso para determinar de forma eficiente qué objetos web almacenar en estas cachés. Casi tres cuartas partes de las URL a las que se accede desde una caché web típica son de acceso único, es decir, que los usuarios acceden solo una vez y nunca más. Almacenar este tipo de URL en una caché web supone un claro desperdicio de recursos de disco, ya que nunca se volverán a utilizar. Para evitar el almacenamiento en caché de URL de acceso único, se utiliza un filtro Bloom para realizar un seguimiento de todas las URL a las que acceden los usuarios. Un objeto web se almacena en caché solo cuando se ha accedido a él al menos una vez, es decir, se almacena en caché en su segunda solicitud. El uso de un filtro Bloom de esta manera reduce significativamente la carga de trabajo de escritura en disco, ya que la mayoría de las URL de acceso único no se escriben en la caché. Además, filtrar estas URL también ahorra espacio en la caché, lo que aumenta la tasa de aciertos. [ 13 ]

Evitar falsos positivos en un universo finito

Kiss et al. describieron una nueva construcción para el filtro de Bloom que evita los falsos positivos, además de la típica inexistencia de falsos negativos. [ 36 ] La construcción se aplica a un universo finito del cual se toman los elementos del conjunto. Se basa en el esquema de prueba de grupo combinatorio no adaptativo existente de Eppstein, Goodrich y Hirschberg. A diferencia del filtro de Bloom típico, los elementos se convierten en una matriz de bits mediante funciones deterministas, rápidas y fáciles de calcular. El tamaño máximo del conjunto para el cual se evitan por completo los falsos positivos es una función del tamaño del universo y está controlado por la cantidad de memoria asignada.

Alternativamente, se puede construir un filtro Bloom inicial de la forma estándar y luego, con un dominio finito y enumerable, se pueden encontrar exhaustivamente todos los falsos positivos y, a partir de esa lista, se construye un segundo filtro Bloom; los falsos positivos en el segundo filtro se manejan de manera similar construyendo un tercero, y así sucesivamente. Como el universo es finito y el conjunto de falsos positivos se reduce estrictamente con cada paso, este procedimiento da como resultado una cascada finita de filtros Bloom que (en este dominio cerrado y finito) producirá solo verdaderos positivos y verdaderos negativos. Para verificar la pertenencia a la cascada de filtros, se consulta el filtro inicial y, si el resultado es positivo, se consulta el segundo filtro, y así sucesivamente. Esta construcción se utiliza en CRLite , un mecanismo propuesto de distribución del estado de revocación de certificados para la PKI web , y se aprovecha la Transparencia de Certificados para cerrar el conjunto de certificados existentes. [ 37 ]

Conteo de filtros Bloom

Los filtros de conteo permiten implementar una operación de eliminación en un filtro Bloom sin necesidad de recrearlo. En un filtro de conteo, las posiciones de la matriz (cubetas) se extienden de un solo bit a un contador multibit. De hecho, los filtros Bloom convencionales pueden considerarse filtros de conteo con un tamaño de cubeta de un bit. Los filtros de conteo fueron introducidos por Fan et al. (2000) .

La operación de inserción se extiende para incrementar el valor de los depósitos, y la operación de búsqueda verifica que cada uno de los depósitos requeridos sea distinto de cero. La operación de eliminación consiste entonces en decrementar el valor de cada uno de los depósitos correspondientes.

El desbordamiento aritmético de los cubetas es un problema, y ​​estas deben ser lo suficientemente grandes para que este caso sea poco frecuente. Si se produce, las operaciones de incremento y decremento deben dejar el conjunto de cubetas con el valor máximo posible para conservar las propiedades de un filtro Bloom.

El tamaño de los contadores suele ser de 3 o 4 bits. Por lo tanto, los filtros Bloom de conteo utilizan de 3 a 4 veces más espacio que los filtros Bloom estáticos. En contraste, las estructuras de datos de Pagh, Pagh y Rao (2005) y Fan et al. (2014) también permiten eliminaciones, pero utilizan menos espacio que un filtro Bloom estático.

Otro problema de los filtros de conteo es su limitada escalabilidad . Dado que la tabla del filtro Bloom de conteo no se puede ampliar, es necesario conocer de antemano el número máximo de claves que se pueden almacenar simultáneamente en el filtro. Una vez superada la capacidad de la tabla, la tasa de falsos positivos aumentará rápidamente a medida que se inserten más claves.

Bonomi et al. (2006) introdujeron una estructura de datos basada en el hash d-izquierdo que es funcionalmente equivalente, pero utiliza aproximadamente la mitad del espacio que los filtros de Bloom convencionales. El problema de escalabilidad no se presenta en esta estructura de datos. Una vez superada la capacidad de diseño, las claves se pueden reinsertar en una nueva tabla hash del doble de tamaño.

La variante que optimiza el uso del espacio, propuesta por Putze, Sanders y Singler (2007), también podría utilizarse para implementar filtros de conteo, permitiendo inserciones y eliminaciones.

Rottenstreich, Kanizo y Keslassy (2012) introdujeron un nuevo método general basado en incrementos de variables que mejora significativamente la probabilidad de falsos positivos al contar filtros de Bloom y sus variantes, sin dejar de admitir eliminaciones. A diferencia del conteo de filtros de Bloom, en cada inserción de elemento, los contadores hash se incrementan mediante un incremento de variable hash en lugar de un incremento unitario. Para consultar un elemento, se consideran los valores exactos de los contadores y no solo su positividad. Si la suma representada por un valor de contador no puede componerse con el incremento de variable correspondiente para el elemento consultado, se puede devolver una respuesta negativa a la consulta.

Kim et al. (2019) muestran que el falso positivo del filtro Counting Bloom disminuye de k=1 a un punto definidokopagt{\displaystyle k_{opt}}y aumenta desdekopagt{\displaystyle k_{opt}}hasta el infinito positivo, y encuentrakopagt{\displaystyle k_{opt}}en función del umbral de recuento. [ 38 ]

Agregación descentralizada

Los filtros de Bloom pueden organizarse en estructuras de datos distribuidas para realizar cálculos totalmente descentralizados de funciones agregadas . La agregación descentralizada permite que las mediciones colectivas estén disponibles localmente en cada nodo de una red distribuida sin necesidad de una entidad computacional centralizada para este fin. [ 39 ]

Filtros Bloom distribuidos

Filtro Bloom de disparo único distribuido para la detección de duplicados con tasa de falsos positivos: 6 elementos se distribuyen entre 3 PE, cada uno con una matriz de bits de longitud 4. Durante el primer paso de comunicación, el PE 1 recibe el hash '2' dos veces y lo envía de vuelta al PE 2 o al PE 3, según quién lo haya enviado posteriormente. El PE que recibe el hash '2' busca el elemento con ese hash y lo marca como posible duplicado.

Los filtros Bloom paralelos pueden implementarse para aprovechar los múltiples elementos de procesamiento (PE) presentes en las máquinas paralelas sin recursos compartidos . Uno de los principales obstáculos para un filtro Bloom paralelo es la organización y comunicación de los datos no ordenados que, en general, se distribuyen uniformemente entre todos los PE al inicio o en las inserciones por lotes. Para ordenar los datos se pueden utilizar dos enfoques, ya sea que el filtro Bloom sobre todos los datos se almacene en cada PE, llamado filtro Bloom replicante, o que el filtro Bloom sobre todos los datos se divida en partes iguales, almacenando cada PE una parte de él. [ 40 ] Para ambos enfoques se utiliza un filtro Bloom de "disparo único" que solo calcula un hash, lo que resulta en un bit invertido por elemento, para reducir el volumen de comunicación.

Los filtros Bloom distribuidos se inician aplicando primero un hash a todos los elementos en su PE local y luego ordenándolos localmente por sus hashes. Esto se puede hacer en tiempo lineal utilizando, por ejemplo, el algoritmo de ordenación por cubetas y también permite la detección local de duplicados. La ordenación se utiliza para agrupar los hashes con su PE asignado como separador para crear un filtro Bloom para cada grupo. Después de codificar estos filtros Bloom utilizando, por ejemplo, la codificación Golomb, cada filtro Bloom se envía como un paquete al PE responsable de los valores hash que se insertaron en él. Un PE p es responsable de todos los hashes entre los valorespag(s/|PE|){\displaystyle p*(s/|{\text{PE}}|)}y(pag+1)(s/|PE|){\displaystyle (p+1)*(s/|{\text{PE}}|)}donde s es el tamaño total del filtro de Bloom sobre todos los datos. Debido a que cada elemento se aplica una sola función hash y, por lo tanto, solo se activa un bit, para verificar si un elemento se insertó en el filtro de Bloom, solo es necesario operar sobre el PE responsable del valor hash del elemento. Las operaciones de inserción únicas también se pueden realizar de manera eficiente porque solo se debe cambiar el filtro de Bloom de un PE, en comparación con los filtros de Bloom replicados, donde cada PE tendría que actualizar su filtro de Bloom. Al distribuir el filtro de Bloom global entre todos los PE en lugar de almacenarlo por separado en cada PE, el tamaño de los filtros de Bloom puede ser mucho mayor, lo que resulta en una mayor capacidad y una menor tasa de falsos positivos. Los filtros de Bloom distribuidos se pueden utilizar para mejorar los algoritmos de detección de duplicados [ 41 ] al filtrar los elementos más "únicos". Estos se pueden calcular comunicando solo los hashes de los elementos, no los elementos mismos, que son mucho más grandes en volumen, y eliminándolos del conjunto, lo que reduce la carga de trabajo para el algoritmo de detección de duplicados utilizado posteriormente.

Durante la comunicación de los hashes, los PE buscan bits que estén activados en más de uno de los paquetes recibidos, ya que esto significaría que dos elementos tienen el mismo hash y, por lo tanto, podrían ser duplicados. Si esto ocurre, se envía un mensaje que contiene el índice del bit, que también es el hash del elemento que podría ser un duplicado, a los PE que enviaron un paquete con el bit activado. Si un remitente envía varios índices al mismo PE, puede ser ventajoso codificar también los índices. Todos los elementos que no recibieron su hash de vuelta ahora tienen la garantía de no ser duplicados y no se evaluarán más; para los elementos restantes se puede utilizar un algoritmo de Reparticionamiento [ 42 ] . Primero, todos los elementos que recibieron su valor hash de vuelta se envían al PE responsable de su hash. Ahora se garantiza que cualquier elemento y su duplicado estén en el mismo PE. En el segundo paso, cada PE utiliza un algoritmo secuencial para la detección de duplicados en los elementos recibidos, que son solo una fracción de la cantidad de elementos iniciales. Al permitir una tasa de falsos positivos para los duplicados, se puede reducir aún más el volumen de comunicación, ya que los procesadores no tienen que enviar elementos con hashes duplicados; en su lugar, cualquier elemento con un hash duplicado se puede marcar como duplicado. Como resultado, la tasa de falsos positivos para la detección de duplicados es la misma que la del filtro Bloom utilizado.

El proceso de filtrado de los elementos más singulares puede repetirse varias veces modificando la función hash en cada paso. Si se utiliza un único paso de filtrado, se obtiene una baja tasa de falsos positivos; sin embargo, si se repite una vez, el primer paso puede generar una tasa de falsos positivos mayor, mientras que el segundo, aunque también mayor, procesa menos elementos, ya que muchos se han eliminado en el paso anterior. Si bien el uso de más de dos repeticiones puede reducir aún más el volumen de comunicación si el número de duplicados en un conjunto es pequeño, la ventaja de estas complicaciones adicionales es mínima.

Los filtros de Bloom replicantes organizan sus datos utilizando un algoritmo de hipercubo bien conocido para el intercambio de información, por ejemplo [ 43 ]. Primero, cada PE calcula el filtro de Bloom sobre todos los elementos locales y lo almacena. Al repetir un bucle donde en cada paso i los PE envían su filtro de Bloom local sobre la dimensión i y fusionan el filtro de Bloom que reciben sobre la dimensión con su filtro de Bloom local, es posible duplicar los elementos que contiene cada filtro de Bloom en cada iteración. Después de enviar y recibir filtros de Bloom sobre todosregistro|PE|{\displaystyle \log |{\text{PE}}|}Las dimensiones de cada PE contienen el filtro Bloom global sobre todos los elementos.

Los filtros Bloom replicados son más eficientes cuando el número de consultas es mucho mayor que el número de elementos que contiene el filtro Bloom; el punto de equilibrio en comparación con los filtros Bloom distribuidos es aproximadamente después de|PE||Elementos|/registroF+|PE|{\displaystyle |{\text{PE}}|*|{\text{Elements}}|/\log _{f^{\text{+}}}|{\text{PE}}|}accesos, conF+{\displaystyle f^{\text{+}}}como la tasa de falsos positivos del filtro Bloom.

Sincronización de datos

Los filtros de Bloom pueden utilizarse para la sincronización aproximada de datos, como en Byers et al. (2004) . Los filtros de Bloom de conteo pueden utilizarse para aproximar el número de diferencias entre dos conjuntos, y este enfoque se describe en Agarwal y Trachtenberg (2006) .

Filtros Bloom para datos en streaming

Los filtros de Bloom se pueden adaptar al contexto de datos en flujo. Por ejemplo, Deng y Rafiei (2006) propusieron filtros de Bloom estables, que consisten en un filtro de Bloom de conteo donde la inserción de un nuevo elemento establece los contadores asociados a un valor c , y luego solo una cantidad fija s de contadores disminuye en 1, por lo que la memoria contiene principalmente información sobre elementos recientes (intuitivamente, se podría suponer que la vida útil de un elemento dentro de un SBF de N contadores es de alrededor dedosnorte{\displaystyle c{\tfrac {s}{N}}}Otra solución es el filtro Bloom de envejecimiento, que consta de dos filtros Bloom, cada uno ocupando la mitad de la memoria total disponible: cuando un filtro está lleno, el segundo se borra y se añaden nuevos elementos a este filtro vacío. [ 44 ]

Sin embargo, se ha demostrado [ 45 ] que, independientemente del filtro, después de n inserciones, la suma de los falsos positivosFPAG{\displaystyle FP}y falso negativoFnorte{\displaystyle FN}Las probabilidades están acotadas inferiormente porFPAG+Fnorte11(11L)metro1(11L)norte{\displaystyle FP+FN\geq 1-{\frac {1-\left(1-{\frac {1}{L}}\right)^{m}}{1-\left(1-{\frac {1}{L}}\right)^{n}}}}donde L es la cantidad de todos los elementos posibles (el tamaño del alfabeto), m el tamaño de la memoria (en bits), suponiendonorte>metro{\displaystyle n>m}. Este resultado muestra que para L suficientemente grande y n tendiendo a infinito, entonces el límite inferior converge aFPAG+Fnorte=1{\displaystyle FP+FN=1}, que es la relación característica de un filtro aleatorio. Por lo tanto, después de suficientes inserciones, y si el alfabeto es demasiado grande para almacenarse en la memoria (lo cual se asume en el contexto de los filtros probabilísticos), es imposible que un filtro tenga un rendimiento mejor que el azar. Este resultado se puede aprovechar esperando que un filtro opere solo sobre una ventana deslizante en lugar de sobre todo el flujo. En este caso, el exponente n en la fórmula anterior se reemplaza por w , lo que da como resultado una fórmula que podría desviarse de 1, si w no es demasiado pequeño.

Filtros Bloomier

Chazelle et al. (2004) diseñaron una generalización de los filtros de Bloom que podía asociar un valor a cada elemento insertado, implementando un array asociativo . Al igual que los filtros de Bloom, estas estructuras logran una sobrecarga de espacio mínima al aceptar una pequeña probabilidad de falsos positivos. En el caso de los "filtros Bloomier", un falso positivo se define como la devolución de un resultado cuando la clave no está presente en el mapa. El mapa nunca devolverá un valor incorrecto para una clave que sí está presente.

Aproximadores compactos

Boldi y Vigna (2005) propusieron una generalización de los filtros de Bloom basada en retículos . Un aproximador compacto asocia a cada clave un elemento de un retículo (los filtros de Bloom estándar son el caso del retículo booleano de dos elementos). En lugar de un arreglo de bits, utilizan un arreglo de elementos del retículo. Al agregar una nueva asociación entre una clave y un elemento del retículo, calculan el máximo de los valores actuales de las k posiciones del arreglo asociadas a la clave con el elemento del retículo. Al leer el valor asociado a una clave, calculan el mínimo de los valores encontrados en las k posiciones asociadas a la clave. El valor resultante se aproxima por encima del valor original.

Filtros de Bloom con partición paralela

Esta implementación utilizó un arreglo separado para cada función hash. Este método permite cálculos hash paralelos tanto para inserciones como para consultas. [ 46 ]

Filtros Bloom escalables

Almeida et al. (2007) propusieron una variante de los filtros de Bloom que se adapta dinámicamente al número de elementos almacenados, garantizando una probabilidad mínima de falsos positivos. La técnica se basa en secuencias de filtros de Bloom estándar con capacidad creciente y probabilidades de falsos positivos más estrictas, de modo que se pueda establecer de antemano una probabilidad máxima de falsos positivos, independientemente del número de elementos que se vayan a insertar.

Filtros Bloom espaciales

Los filtros espaciales de Bloom (SBF) fueron propuestos originalmente por Palmieri, Calderoni y Maio (2014) como una estructura de datos diseñada para almacenar información de ubicación , especialmente en el contexto de protocolos criptográficos para la privacidad de la ubicación . Sin embargo, la característica principal de los SBF es su capacidad para almacenar múltiples conjuntos en una sola estructura de datos, lo que los hace adecuados para una serie de escenarios de aplicación diferentes. [ 47 ] Se puede consultar la pertenencia de un elemento a un conjunto específico, y la probabilidad de falso positivo depende del conjunto: los primeros conjuntos que se ingresan en el filtro durante la construcción tienen mayores probabilidades de falso positivo que los conjuntos ingresados ​​al final. [ 48 ] Esta propiedad permite una priorización de los conjuntos, donde se pueden preservar los conjuntos que contienen elementos más "importantes".

Filtros Bloom en capas

Un filtro Bloom por capas consta de múltiples capas de filtro Bloom. Los filtros Bloom por capas permiten realizar un seguimiento de cuántas veces se agregó un elemento al filtro Bloom, comprobando en cuántas capas se encuentra dicho elemento. Con un filtro Bloom por capas, una operación de comprobación normalmente devolverá el número de la capa más profunda en la que se encontró el elemento. [ 49 ]

Filtros Bloom atenuados

Ejemplo de filtro Bloom atenuado: Buscar el patrón 11010, comenzando desde el nodo n1.

Un filtro Bloom atenuado de profundidad D puede considerarse como una matriz de D filtros Bloom normales. En el contexto del descubrimiento de servicios en una red, cada nodo almacena localmente filtros Bloom regulares y atenuados. El filtro Bloom regular o local indica qué servicios ofrece el propio nodo. El filtro atenuado de nivel i indica qué servicios se pueden encontrar en nodos que se encuentran a i saltos del nodo actual. El valor i se construye tomando la unión de los filtros Bloom locales para los nodos que se encuentran a i saltos del nodo. [ 50 ]

Por ejemplo, consideremos una red pequeña, como se muestra en el gráfico a continuación. Supongamos que buscamos un servicio A cuyo ID se codifica mediante hashes a los bits 0, 1 y 3 (patrón 11010). Sea el nodo n1 el punto de partida. Primero, verificamos si n1 ofrece el servicio A consultando su filtro local. Dado que los patrones no coinciden, consultamos el filtro Bloom atenuado para determinar qué nodo debería ser el siguiente salto. Observamos que n2 no ofrece el servicio A, pero se encuentra en la ruta hacia nodos que sí lo ofrecen. Por lo tanto, nos movemos a n2 y repetimos el mismo procedimiento. Rápidamente encontramos que n3 ofrece el servicio y, por lo tanto, se localiza el destino. [ 51 ]

Al utilizar filtros Bloom atenuados que constan de múltiples capas, se pueden descubrir servicios a más de una distancia de salto, evitando la saturación del filtro Bloom mediante la atenuación (desplazamiento) de los bits establecidos por fuentes más lejanas. [ 50 ]

Búsqueda de estructuras químicas

Los filtros de Bloom se utilizan a menudo para buscar en grandes bases de datos de estructuras químicas (véase similitud química ). En el caso más simple, los elementos añadidos al filtro (denominado huella digital en este campo) son simplemente los números atómicos presentes en la molécula, o un hash basado en el número atómico de cada átomo y el número y tipo de sus enlaces. Este caso es demasiado simple para ser útil. Los filtros más avanzados también codifican recuentos de átomos, características de subestructuras más grandes como grupos carboxilo y propiedades de grafos como el número de anillos. En las huellas digitales basadas en hash, se utiliza una función hash basada en propiedades de átomos y enlaces para convertir un subgrafo en una semilla de PRNG , y los primeros valores de salida se utilizan para establecer bits en el filtro de Bloom.

Las huellas moleculares surgieron a finales de la década de 1940 como una forma de buscar estructuras químicas en tarjetas perforadas. Sin embargo, no fue hasta alrededor de 1990 que Daylight Chemical Information Systems, Inc. introdujo un método basado en hash para generar los bits, en lugar de utilizar una tabla precalculada. A diferencia del enfoque de diccionario, el método hash puede asignar bits a subestructuras que no se habían visto previamente. A principios de la década de 1990, el término "huella molecular" se consideraba distinto de "claves estructurales", pero desde entonces ha evolucionado para abarcar la mayoría de las características moleculares que se pueden utilizar para una comparación de similitud, incluidas las claves estructurales, las huellas moleculares de conteo disperso y las huellas moleculares 3D. A diferencia de los filtros Bloom, el método hash de Daylight permite que el número de bits asignados por característica sea una función del tamaño de la característica, pero la mayoría de las implementaciones de huellas moleculares tipo Daylight utilizan un número fijo de bits por característica, lo que las convierte en un filtro Bloom. Las huellas moleculares originales de Daylight podían utilizarse tanto para la comparación de similitud como para el cribado. Muchos otros tipos de huellas dactilares, como la popular ECFP2, pueden utilizarse para la detección de similitudes, pero no para el cribado, ya que incluyen características ambientales locales que generan falsos negativos al usarse como método de cribado. Aunque se construyan con el mismo mecanismo, no son filtros de Bloom porque no pueden utilizarse para filtrar.

Véase también

Referencias

Citas

  1. Bloom (1970) .
  2. Bonomi et al. (2006) .
  3. Dillinger y Manolios (2004a) ; Kirsch y Mitzenmacher (2006) .
  4. Mitzenmacher y Upfal (2005) .
  5. ^ Blustein y El-Maazawi (2002) , págs. 21-22
  6. Gopinathan, Kiran; Sergey, Ilya (21 de julio de 2020). «Certificación de certeza e incertidumbre en estructuras de consulta de pertenencia aproximada». Verificación asistida por computadora . Notas de clase en ciencias de la computación. Vol.  12225. Springer, Cham. págs. 279–303 . doi : 10.1007/978-3-030-53291-8_16 . ISBN  978-3-030-53290-1. PMC 7363400 . 
  7. Mitzenmacher y Upfal (2005) , págs. 109–111, 308.
  8. Mitzenmacher y Upfal (2005) , pág. 308.
  9. Starobinski, Trachtenberg y Agarwal (2003)
  10. Goel y Gupta (2010)
  11. 1 2 Swamidass, S. Joshua; Baldi, Pierre (2007). "Corrección matemática para medidas de similitud de huellas dactilares para mejorar la recuperación química". Journal of Chemical Information and Modeling . 47 (3): 952– 964. doi : 10.1021/ci600526a . PMID 17444629 . 
  12. Dasgupta, Sanjoy; Sheehan, Timothy C.; Stevens, Charles F.; Navlakha, Saket (2018-12-18). "Una estructura de datos neuronal para la detección de novedades" . Actas de la Academia Nacional de Ciencias . 115 (51): 13093– 13098. Bibcode : 2018PNAS..11513093D . doi : 10.1073/pnas.1814448115 . ISSN 0027-8424 . PMC 6304992. PMID 30509984 .   
  13. ^ Maggs y Sitaraman (2015 ) .
  14. "Módulo contrib de índice Bloom" . Postgresql.org. 1 de abril de 2016. Archivado del original el 9 de septiembre de 2018. Consultado el 18 de junio de 2016 .
  15. Chang et al. (2006) ; Apache Software Foundation (2012) .
  16. Yakunin, Alex (25 de marzo de 2010). "Blog de Alex Yakunin: Buena aplicación de filtro Bloom" . Blog.alexyakunin.com. Archivado del original el 27 de octubre de 2010. Consultado el 31 de mayo de 2014 .
  17. "Problema 10896048: Transición de la navegación segura del filtro bloom al conjunto de prefijos. - Revisión de código" . Chromiumcodereview.appspot.com . Consultado el 3 de julio de 2014 .
  18. Jones, JC (09/01/2020). "Presentamos CRLite: Todas las revocaciones de la PKI web, comprimidas" . Blog de seguridad de Mozilla . Consultado el 12/01/2026 .
  19. Jones, JC (2020-01-09). "El diseño integral de CRLite" . Blog de seguridad de Mozilla . Recuperado el 2026-01-12 .
  20. Colville, Stuart (24 de agosto de 2020). "Presentación de una lista de bloqueo de complementos escalable" . Blog de la comunidad de complementos de Mozilla . Recuperado el 12 de enero de 2026 .
  21. Goodwin, Bob; Hopcroft, Michael; Luu, Dan; Clemmer, Alex; Curmei, Mihaela; Elnikety, Sameh; Yuxiong, He (2017). "BitFunnel: Revisando las firmas para la búsqueda" (PDF) . Actas de la 40.ª Conferencia Internacional ACM SIGIR sobre Investigación y Desarrollo en Recuperación de Información . págs. 605–614 . doi : 10.1145/3077136.3080789 . ISBN  978-1-4503-5022-8. S2CID 20123252 . 
  22. Wessels (2004) .
  23. "Filtro Bloom | Glosario de River" . River Financial . Consultado el 14 de noviembre de 2020 .
  24. "Plan 9 /sys/man/8/venti" . Plan9.bell-labs.com. Archivado del original el 28 de agosto de 2014. Consultado el 31 de mayo de 2014 .
  25. "Spin - Verificación formal" .
  26. Mullin (1990) .
  27. "¿Qué son los filtros Bloom?" . Medium. 15 de julio de 2015. Consultado el 1 de noviembre de 2015 .
  28. "Documentación de Grafana Tempo - Almacenamiento en caché" . Grafana . Consultado el 16 de noviembre de 2022 .
  29. 1 2 Carter, Larry; Floyd, Robert; Gill, John; Markowsky, George; Wegman, Mark (1978). "Probadores de pertenencia exactos y aproximados" . Actas del décimo simposio anual de la ACM sobre Teoría de la Computación - STOC '78 . Nueva York, Nueva York, EE. UU.: ACM Press. págs. 59–65 . doi : 10.1145/800133.804332 . S2CID 6465743 .  
  30. Pagh, Pagh y Rao (2005) .
  31. Bender, Michael A.; Farach-Colton, Martin; Johnson, Rob; Kraner, Russell; Kuszmaul, Bradley C.; Medjedovic, Dzejla; Montes, Pablo; Shetty, Pradeep; Spillane, Richard P.; Zadok, Erez (julio de 2012). "No te descontroles" . Actas de la Fundación VLDB . 5 (11): 1627– 1637. doi : 10.14778/2350229.2350275 . ISSN 2150-8097 . S2CID 47180056 .  
  32. 1 2 Even, Tomer; Even, Guy; Morrison, Adam (marzo de 2022). "Filtro de prefijo" . Actas de la Fundación VLDB . 15 (7): 1311– 1323. doi : 10.14778/3523210.3523211 . ISSN 2150-8097 . 
  33. Bender, Michael A.; Farach-Colton, Martín; Kuszmaul, John; Kuszmaul, William; Liu, Mingmou (2022-06-09). "Sobre el equilibrio óptimo tiempo/espacio para tablas hash" . Actas del 54.º Simposio Anual ACM SIGACT sobre Teoría de la Computación . Nueva York, NY, EE. UU.: ACM. págs. 1284–1297 . arXiv : 2111.00602 . doi : 10.1145/3519935.3519969 . hdl : 1721.1/146419 . ISBN  9781450392648. S2CID 240354692 . 
  34. 1 2 Luo, Lailong; Guo, Deke; Ma, Richard TB; Rottenstreich, Ori; Luo, Xueshan (13 de abril de 2018). "Optimización del filtro de Bloom: desafíos, soluciones y comparaciones". arXiv : 1804.04777 [ cs.DS ].
  35. Dasgupta, Sanjoy; Sheehan, Timothy C.; Stevens, Charles F.; Navlakhae, Saket (2018). "Una estructura de datos neuronal para la detección de novedades" . Actas de la Academia Nacional de Ciencias . 115 (51): 13093– 13098. Bibcode : 2018PNAS..11513093D . doi : 10.1073/pnas.1814448115 . PMC 6304992. PMID 30509984 .  
  36. ^ Beso, SZ; Hosszu, E.; Tapolcai, J.; Rónyai, L.; Rottenstreich, O. (2018). "Filtro de floración con zona libre de falsos positivos" (PDF) . Actas IEEE de INFOCOM . Consultado el 4 de diciembre de 2018 .
  37. Larisch, James; Choffnes, David; Levin, Dave; Maggs, Bruce M.; Mislove, Alan; Wilson, Christo (2017). "CRLite: Un sistema escalable para enviar todas las revocaciones TLS a todos los navegadores". Simposio IEEE de 2017 sobre seguridad y privacidad (SP) . págs. 539–556 . doi : 10.1109/sp.2017.17 . ISBN  978-1-5090-5533-3. S2CID 3926509 . 
  38. Kim, Kibeom; Jeong, Yongjo; Lee, Youngjoo; Lee, Sunggu (2019-07-11). "Análisis de filtros Bloom de conteo utilizados para umbralización de conteo" . Electronics . 8 (7): 779. doi : 10.3390/electronics8070779 . ISSN 2079-9292 . 
  39. Pournaras, Warnier y Brasero (2013) .
  40. Sanders, Peter; Schlag, Sebastian; Müller, Ingo (2013). «Algoritmos de comunicación eficientes para problemas fundamentales de big data». 2013 IEEE International Conference on Big Data . pp. 15–23 . doi : 10.1109/BigData.2013.6691549 . ISBN  978-1-4799-1293-3. S2CID 15968541 . 
  41. Schlag, Sebastian (2013). "Eliminación distribuida de duplicados". Instituto Tecnológico de Karlsruhe .
  42. Shatdal, Ambuj; Jeffrey F. Naughton (1994). "Procesamiento de agregados en sistemas de bases de datos paralelas". Departamento de Ciencias de la Computación de la Universidad de Wisconsin-Madison : 8.
  43. V. Kumar; A. Grama; A. Gupta; G. Karypis (1994). Introducción a la computación paralela. Diseño y análisis de algoritmos . Benjamin/Cummings.
  44. Yoon, MyungKeun (2010). "Filtro Bloom de envejecimiento con dos búferes activos para conjuntos dinámicos". IEEE Transactions on Knowledge and Data Engineering . 22 (1): 134– 138. Bibcode : 2010ITKDE..22..134Y . doi : 10.1109/TKDE.2009.136 . S2CID 15922054 . 
  45. Géraud-Stewart, Rémi; Lombard-Platet, Marius; Naccache, David (2020). "Aproximación a la detección óptima de duplicados en una ventana deslizante". Computing and Combinatorics . Lecture Notes in Computer Science. Vol. 12273. pp. 64–84 . arXiv : 2005.04740 . doi : 10.1007/978-3-030-58150-3_6 . ISBN   978-3-030-58149-7. S2CID 218581915 . 
  46. Kirsch, Adam; Mitzenmacher†, Michael. "Menos hash, mismo rendimiento: Construyendo un mejor filtro Bloom" (PDF) . Escuela de Ingeniería y Ciencias Aplicadas de Harvard . Wiley InterScience.
  47. Calderoni, Palmieri & Maio (2015) .
  48. Calderoni, Palmieri & Maio (2018) .
  49. Zhiwang, Jungang y Jian (2010) .
  50. ^ Koucheryavy y col. (2009) .
  51. Kubiatowicz y otros. (2000) .

Obras citadas

  • Agarwal, Sachin; Trachtenberg, Ari (2006). "Aproximación del número de diferencias entre conjuntos remotos". 2006 IEEE Information Theory Workshop (PDF) . Punta del Este, Uruguay. p.  217. CiteSeerX 10.1.1.69.1033 . doi : 10.1109/ITW.2006.1633815 . ISBN  978-1-4244-0035-5. S2CID 2048278 . {{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace )
  • Ahmadi, Mahmood; Wong, Stephan (2007), "Una arquitectura de caché para el conteo de filtros de Bloom", XV Conferencia Internacional sobre Redes (ICON-2007) , pág.  218, CiteSeerX 10.1.1.125.2470 , doi : 10.1109/ICON.2007.4444089 , ISBN  978-1-4244-1229-7, S2CID 2967865 
  • Almeida, Paulo; Baquero, Carlos; Preguica, Nuño; Hutchison, David (2007), "Filtros de floración escalables" (PDF) , Cartas sobre procesamiento de información , 101 (6): 255– 261, doi : 10.1016/j.ipl.2006.10.007 , hdl : 1822/6627
  • Apache Software Foundation (2012), "11.6. Diseño de esquemas" , Guía de referencia de Apache HBase, Revisión 0.94.27
  • Bloom, Burton H. (1970), "Compromisos espacio-tiempo en la codificación hash con errores permitidos", Communications of the ACM , 13 (7): 422– 426, CiteSeerX 10.1.1.641.9096 , doi : 10.1145/362686.362692 , S2CID 7931252  
  • Blustein, James; El-Maazawi, Amal (2002), "caso óptimo para filtros de Bloom generales", Filtros de Bloom: un tutorial, análisis y revisión , Facultad de Ciencias de la Computación de la Universidad de Dalhousie, págs . 1–31 
  • Boldi, Paolo; Vigna, Sebastiano (2005), "Cadenas mutables en Java: diseño, implementación y algoritmos ligeros de búsqueda de texto" , Science of Computer Programming , 54 (1): 3–23 , doi : 10.1016/j.scico.2004.05.003 , archivado del original el 7 de febrero de 2025
  • Bonomi, Flavio; Mitzenmacher, Michael ; Panigrahy, Rina; Singh, Sushil; Varghese, George (2006), "Una construcción mejorada para el conteo de filtros de Bloom", Algoritmos – ESA 2006, 14.º Simposio Europeo Anual (PDF) , Lecture Notes in Computer Science , vol.  4168, pp. 684–695 , doi : 10.1007/11841036_61 , ISBN  978-3-540-38875-3
  • Broder, Andrei ; Mitzenmacher, Michael (2005), "Aplicaciones de red de los filtros de Bloom: una revisión" (PDF) , Internet Mathematics , 1 (4): 485–509 , doi : 10.1080/15427951.2004.10129096 , S2CID 1560675 
  • Byers, John W.; Considine, Jeffrey; Mitzenmacher, Michael ; Rost, Stanislav (2004), "Entrega de contenido informado a través de redes superpuestas adaptativas", IEEE/ACM Transactions on Networking , 12 (5): 767, Bibcode : 2004ITNet..12..767B , CiteSeerX 10.1.1.207.1563 , doi : 10.1109/TNET.2004.836103 , S2CID 47088273  
  • Calderoni, Luca; Palmieri, Paolo; Maio, Dario (2015), "Privacidad de la ubicación sin confianza mutua: El filtro espacial de Bloom" (PDF) , Computer Communications , 68 : 4–16 , doi : 10.1016/j.comcom.2015.06.011 , hdl : 10468/4762 , ISSN 0140-3664 
  • Calderoni, Luca; Palmieri, Paolo; Maio, Dario (2018), "Propiedades probabilísticas de los filtros Bloom espaciales y su relevancia para los protocolos criptográficos", IEEE Transactions on Information Forensics and Security , 13 (7): 1710– 1721, Bibcode : 2018ITIF...13.1710C , doi : 10.1109/TIFS.2018.2799486 , hdl : 10468/5767 , ISSN 1556-6013 , S2CID 3693354  
  • Chang, Fay; Dean, Jeffrey; Ghemawat, Sanjay; Hsieh, Wilson; Wallach, Deborah; Burrows, Mike; Chandra, Tushar; Fikes, Andrew; Gruber, Robert (2006), "Bigtable: Un sistema de almacenamiento distribuido para datos estructurados", Séptimo Simposio sobre Diseño e Implementación de Sistemas Operativos
  • Charles, Denis Xavier; Chellapilla, Kumar (2008), "Filtros Bloomier: Una segunda mirada", en Halperin, Dan; Mehlhorn, Kurt (eds.), Algoritmos: ESA 2008, 16.º Simposio Europeo Anual, Karlsruhe, Alemania, 15-17 de septiembre de 2008, Actas , Lecture Notes in Computer Science, vol.  5193, Springer, pp. 259-270 , arXiv : 0807.0928 , doi : 10.1007/978-3-540-87744-8_22 , ISBN  978-3-540-87743-1, S2CID 643445 
  • Chazelle, Bernard ; Kilian, Joe; Rubinfeld, Ronitt ; Tal, Ayellet (2004), "El filtro Bloomier: una estructura de datos eficiente para tablas de búsqueda de soporte estático", Actas del decimoquinto simposio anual ACM-SIAM sobre algoritmos discretos (PDF) , págs. 30-39 . 
  • Cohen, Saar; Matias, Yossi (2003), "Filtros de Bloom espectrales", Actas de la Conferencia Internacional ACM SIGMOD de 2003 sobre Gestión de Datos (PDF) , págs. 241–252 , doi : 10.1145/872757.872787 , ISBN  978-1581136340, S2CID 1058187 , archivado del original (PDF) el 10-03-2021 , recuperado el 24-10-2019 
  • Deng, Fan; Rafiei, Davood (2006), "Detección aproximada de duplicados para datos en tiempo real mediante filtros Bloom estables", Actas de la Conferencia ACM SIGMOD (PDF) , págs. 25–36 
  • Dharmapurikar, Sarang; Song, Haoyu; Turner, Jonathan; Lockwood, John (2006), "Clasificación rápida de paquetes mediante filtros de Bloom", Actas del Simposio ACM/IEEE de 2006 sobre Arquitectura para Sistemas de Redes y Comunicaciones (PDF) , págs. 61–70 , CiteSeerX 10.1.1.78.9584 , doi : 10.1145/1185347.1185356 , ISBN   978-1595935809, S2CID 7848110 , archivado del original (PDF) el 2 de febrero de 2007 
  • Dietzfelbinger, Martin; Pagh, Rasmus (2008), "Estructuras de datos sucintas para recuperación y pertenencia aproximada", en Aceto, Luca; Damgård, Ivan; Goldberg, Leslie Ann; Halldórsson, Magnús M.; Ingólfsdóttir, Anna; Walukiewicz, Igor (eds.), Autómatas, lenguajes y programación: 35.º Coloquio Internacional, ICALP 2008, Reikiavik, Islandia, 7-11 de julio de 2008, Actas, Parte I, Pista A: Algoritmos, autómatas, complejidad y juegos , Lecture Notes in Computer Science, vol.  5125, Springer, págs. 385–396 , arXiv : 0803.3693 , doi : 10.1007/978-3-540-70575-8_32 , ISBN  978-3-540-70574-1, S2CID 1699996 
  • Dillinger, Peter C.; Manolios, Panagiotis (2004a), "Verificación rápida y precisa del estado de bits para SPIN", Actas del 11.º Taller Internacional de SPIN sobre Software de Verificación de Modelos , Springer-Verlag, Lecture Notes in Computer Science 2989
  • Dillinger, Peter C.; Manolios, Panagiotis (2004b), "Filtros de Bloom en la verificación probabilística", Actas de la 5.ª Conferencia Internacional sobre Métodos Formales en Diseño Asistido por Computadora , Springer-Verlag, Lecture Notes in Computer Science 3312
  • Donnet, Benoit; Baynat, Bruno; Friedman, Timur (2006), "Filtros Bloom retocados: permitiendo que las aplicaciones en red negocien de forma flexible entre falsos positivos y falsos negativos", CoNEXT 06 – 2.ª Conferencia sobre Tecnologías de Redes del Futuro , archivado del original el 17 de mayo de 2009.
  • Eppstein, David ; Goodrich, Michael T. (2007), "Identificación eficiente en espacio de rezagados en flujos de datos de ida y vuelta mediante identidades de Newton y filtros de Bloom invertibles", Algorithms and Data Structures, 10th International Workshop, WADS 2007 , Lecture Notes in Computer Science, vol.  4619, Springer-Verlag, pp. 637–648 , arXiv : 0704.3313 , Bibcode : 2007arXiv0704.3313E 
  • Fan, Bin; Andersen, Dave G.; Kaminsky, Michael; Mitzenmacher, Michael D. (2014), "Filtro Cuckoo: Prácticamente mejor que Bloom", Actas de la 10.ª Conferencia Internacional ACM sobre Experimentos y Tecnologías de Redes Emergentes , pp. 75–88 , doi : 10.1145/2674005.2674994 , ISBN  9781450332798Implementación de código abierto disponible en GitHub .
  • Fan, Li; Cao, Pei ; Almeida, Jussara ; Broder, Andrei (2000), "Summary Cache: A Scalable Wide-Area Web Cache Sharing Protocol" (PDF) , IEEE/ACM Transactions on Networking , 8 (3): 281–293 , Bibcode : 2000ITNet...8..281L , CiteSeerX 10.1.1.41.1487 , doi : 10.1109/90.851975 , S2CID 4779754 , archivado del original (PDF) el 22-09-2017 , recuperado el 30-07-2018  Una versión preliminar apareció en SIGCOMM '98.
  • Goel, Ashish; Gupta, Pankaj (2010), "Consultas de subconjuntos pequeños y filtros Bloom utilizando memorias asociativas ternarias, con aplicaciones" (PDF) , ACM SIGMETRICS Performance Evaluation Review , 38 : 143, CiteSeerX 10.1.1.296.6513 , doi : 10.1145/1811099.1811056 
  • Graf, Thomas Mueller; Lemire, Daniel (2020), "Filtros XOR", ACM Journal of Experimental Algorithmics , 25 : 1–16 , arXiv : 1912.08258 , Bibcode : 2019arXiv191208258M , doi : 10.1145/3376122 , S2CID 209405019 
  • Grandi, Fabio (2018), "Sobre el análisis de los filtros de Bloom" (PDF) , Information Processing Letters , 129 : 35–39 , doi : 10.1016/j.ipl.2017.09.004
  • Kirsch, Adam; Mitzenmacher, Michael (2006), "Menos hashing, mismo rendimiento: Construyendo un mejor filtro de Bloom", en Azar, Yossi; Erlebach, Thomas (eds.), Algorithms – ESA 2006, 14th Annual European Symposium (PDF) , Lecture Notes in Computer Science, vol.  4168, Springer-Verlag, Lecture Notes in Computer Science 4168, pp. 456–467 , doi : 10.1007/11841036 , ISBN  978-3-540-38875-3Archivado del original (PDF) el 31/01/2009
  • Koucheryavy, Y.; Giambene, G.; Staehle, D.; Barceló-Arroyo, F.; Braun, T.; Siris, V. (2009), "Gestión de tráfico y QoS en redes multimedia inalámbricas", Informe final COST 290 : 111
  • Kubiatowicz, J.; Bindel, D.; Czerwinski, Y.; Geels, S.; Eaton, D.; Gummadi, R.; Rhea, S.; Weatherspoon, H.; et  al. (2000), "Oceanstore: Una arquitectura para almacenamiento persistente a escala global" (PDF) , ACM SIGPLAN Notices : 190–201 , archivado del original (PDF) el 11 de marzo de 2012 , recuperado el 1 de diciembre de 2011 .
  • Maggs, Bruce M.; Sitaraman , Ramesh K. (julio de 2015), "Algorithmic nuggets in content delivery" (PDF) , ACM SIGCOMM Computer Communication Review , 45 (3): 52–66 , CiteSeerX 10.1.1.696.9236 , doi : 10.1145/2805789.2805800 , S2CID 65760 , archivado del original (PDF) el 14 de agosto de 2021.  
  • Mitzenmacher, Michael ; Upfal, Eli (2005), Probabilidad y computación: algoritmos aleatorios y análisis probabilístico , Cambridge University Press, pp. 107–112 , ISBN  9780521835404
  • Mortensen, Christian Worm; Pagh, Rasmus ; Pătrașcu, Mihai (2005), "Sobre la presentación de informes de rango dinámico en una dimensión", Actas del Trigésimo Séptimo Simposio Anual de la ACM sobre Teoría de la Computación , págs. 104–111 , arXiv : cs/0502032 , doi : 10.1145/1060590.1060606 , ISBN  978-1581139600, S2CID 56473 
  • Mullin, James K. (1990), "Semijoins óptimos para sistemas de bases de datos distribuidas", IEEE Transactions on Software Engineering , 16 (5): 558– 560, Bibcode : 1990ITSEn..16..558M , doi : 10.1109/32.52778
  • Pagh, Anna; Pagh, Rasmus ; Rao, S. Srinivasa (2005), "Un reemplazo óptimo del filtro de Bloom", Actas del decimosexto simposio anual ACM-SIAM sobre algoritmos discretos (PDF) , págs. 823–829 
  • Palmieri, Paolo; Calderoni, Luca; Maio, Dario (2014), "Filtros Bloom espaciales: Habilitando la privacidad en aplicaciones con conocimiento de la ubicación", Actas de la 10.ª Conferencia Internacional sobre Seguridad de la Información y Criptología (Inscrypt 2014) , vol.  8957, Springer-Verlag, Lecture Notes in Computer Science, pp. 16–36 , CiteSeerX 10.1.1.471.4759 , doi : 10.1007/978-3-319-16745-9_2 , ISBN   978-3-319-16744-2
  • Porat, Ely (2009), "Un reemplazo óptimo del filtro de Bloom basado en la resolución de matrices", en Frid, Anna E.; Morozov, Andrey; Rybalchenko, Andrey; Wagner, Klaus W. (eds.), Ciencias de la Computación, Teoría y Aplicaciones: Cuarto Simposio Internacional de Ciencias de la Computación en Rusia, CSR 2009, Novosibirsk, Rusia, 18-23 de agosto de 2009, Actas , Lecture Notes in Computer Science, vol.  5675, Springer, pp. 263-273 , arXiv : 0804.1845 , doi : 10.1007/978-3-642-03351-3_25 , ISBN  978-3-642-03350-6, S2CID 3205108 
  • Pournaras, E.; Warnier, M.; Brazier, FMT (2013), "Un servicio de agregación genérico y adaptativo para redes descentralizadas a gran escala", Complex Adaptive Systems Modeling , 1 (19): 19, doi : 10.1186/2194-3206-1-19Implementación de prototipo disponible en GitHub .
  • Putze, F.; Sanders, P .; Singler, J. (2007), "Filtros Bloom eficientes en caché, hash y espacio", en Demetrescu, Camil (ed.), Algoritmos experimentales, 6.º Taller Internacional, WEA 2007 (PDF) , Lecture Notes in Computer Science, vol.  4525, Springer-Verlag, Lecture Notes in Computer Science 4525, pp. 108–121 , doi : 10.1007/978-3-540-72845-0 , ISBN  978-3-540-72844-3Archivado desde el original (PDF) el 23/06/2007 , consultado el 18/07/2007.
  • Rottenstreich, Ori; Kanizo, Yossi; Keslassy, ​​Isaac (2012), "El filtro Bloom de conteo de incremento variable", 31.ª Conferencia Internacional Anual IEEE sobre Comunicaciones Informáticas, 2012, Infocom 2012 (PDF) , págs. 1880–1888 , CiteSeerX 10.1.1.174.7165 , doi : 10.1109/INFCOM.2012.6195563 , ISBN   978-1-4673-0773-4
  • Sethumadhavan, Simha; Desikan, Rajagopalan; Burger, Doug; Moore, Charles R.; Keckler, Stephen W. (2003), "Desambiguación de memoria de hardware escalable para procesadores con alto ILP", 36.º Simposio Internacional Anual IEEE/ACM sobre Microarquitectura, 2003, MICRO-36 (PDF) , págs. 399–410 , CiteSeerX 10.1.1.229.1254 , doi : 10.1109/MICRO.2003.1253244 , ISBN   978-0-7695-2043-8, S2CID 195881068 , archivado del original (PDF) el 14/01/2007 
  • Starobinski, David; Trachtenberg, Ari; Agarwal, Sachin (2003), "Sincronización eficiente de PDA" (PDF) , IEEE Transactions on Mobile Computing , 2 (1): 40, Bibcode : 2003ITMC....2...40S , CiteSeerX 10.1.1.71.7833 , doi : 10.1109/TMC.2003.1195150 
  • Stern, Ulrich; Dill, David L. (1996), "Un nuevo esquema para la verificación probabilística con uso eficiente de memoria", Actas de la Conferencia Internacional Conjunta IFIP TC6/WG6.1 sobre Técnicas de Descripción Formal para Sistemas Distribuidos y Protocolos de Comunicación, y Especificación, Pruebas y Verificación de Protocolos , Chapman & Hall, Actas de la Conferencia IFIP, págs. 333–348 , CiteSeerX 10.1.1.47.4101  
  • Wessels, Duane (enero de 2004), "10.7 Cache Digests", Squid: The Definitive Guide (1.ª  ed.), O'Reilly Media, pág.  172, ISBN 978-0-596-00162-9Los resúmenes de caché se basan en una técnica publicada por primera vez por Pei Cao , llamada Summary Cache. La idea fundamental es utilizar un filtro Bloom para representar el contenido de la caché.
  • Tarkoma, Sasu; Rothenberg, Christian Esteve; Lagerspetz, Eemil (2012), "Teoría y práctica de los filtros Bloom para sistemas distribuidos", IEEE Communications Surveys & Tutorials, n.º 1. (PDF) , vol.  14, pp. 131–155 
  • Zhiwang, Cen; Jungang, Xu; Jian, Sun (2010), "Un filtro Bloom multicapa para la detección de URL duplicadas", Actas de la 3.ª Conferencia Internacional sobre Teoría e Ingeniería Informática Avanzada (ICACTE 2010) , vol.  1, págs.  V1–586–V1–591, doi : 10.1109/ICACTE.2010.5578947 , ISBN 978-1-4244-6539-2, S2CID 3108985 
  • "Uso de filtros de Bloom": Explicación detallada de los filtros de Bloom usando Perl.
  • Por qué los filtros Bloom funcionan como lo hacen (Michael Nielsen, 2012)
  • Filtros de Bloom: un tutorial, análisis y estudio (Blustein y El-Maazawi, 2002) en la Universidad de Dalhousie.
  • Tabla de tasas de falsos positivos para diferentes configuraciones de un sitio web de la Universidad de Wisconsin-Madison.
  • "Filtros Bloom más óptimos", Ely Porat (noviembre de 2007), vídeo de Google TechTalk en YouTube.