Al implementar un filtro Bloom, el enfoque tradicional requiere múltiples funciones hash independientes. Kirsch y Mitzenmacher demostraron que en realidad solo necesitas dos, y puedes generar el resto como combinaciones lineales de los mismos.
Mi pregunta es: ¿cuál es realmente la diferencia entre dos funciones hash y una con el doble de entropía?
Esto viene de mirar lo que realmente haces con la salida de tus funciones hash: vas a tomar tu (digamos) valor hash de 64 bits y escalarlo al tamaño de tu vector de bits, que probablemente sea significativamente menor que 2 64 . Esta es claramente una transformación de pérdida de entropía (excepto en el raro caso de que el tamaño de hash y la capacidad del filtro coincidan exactamente). Suponiendo que mi filtro tiene menos de 2 32 entradas, ¿qué me impide dividir mi valor de hash de 64 bits en dos hashes de 32 bits y tomar combinaciones lineales de esos? ¿O usándolo para sembrar un PRNG?
En otras palabras, ¿cuánta información necesito saber realmente sobre cada elemento que inserto en un filtro Bloom para asegurar que se mantenga la tasa de falsos positivos estándar? O, en términos más generales, ¿cuál es la relación entre qué tan bien puedo distinguir elementos (cuántos bits uso para describirlos) y cómo funciona mi filtro Bloom?
Parece que puedo escapar con bits de lg ( m ) para un tamaño de filtro de m , o equivalentemente 2 bits ( lg ( - n ln p ) - 2 lg ( ln 2 ) ) para almacenar n elementos con probabilidad falsamente positiva p ....