布隆过滤器

152 阅读1分钟

布隆过滤器是名叫bloom的家伙在1970年发明的一个过滤器, 核心思想是告诉你说不存在就一定不存在,说存在不一定存在,现在多用于把数据放入内存,减少网络和磁盘的io

底层是利用长度为n的为二进制位数组,上面有k个哈希算法,每次增加需要多个哈希算法判断多个数组位置,然后修改为1; 查找也是一样,通过多个哈希算法查找数组位置是否为1.如果有一个为0,表示不存在

==这里就涉及到一个问题,哈希算法必然存在哈希冲突。一个值的数组位置为0 ,但是被其他值的哈希算法标识为1 ,所以查找时候说存在就不一定存在。== image

换算一下存储100万个元素。就是100万/8/1024≈122千字节 ,还不到1Mb

添加 数据通过多个布隆过滤器函数计算,找到相应的多个二进制数组位,修改为1

查找 同添加一样, 通过多个布隆过滤器函数计算二进制位数组的位置是否为1, 如果都是1,说明有可能存在 如果都不为1,说明一定不存在

删除 因为一个二进制位数据的元素位可能被很多元素共享,所以删除不能实现


/**
*通过google Guava 实现布隆过滤器
*/
public static void main(String[] args) {

        /**
         * 创建bloom过滤器,
         * 固定
         * 数量
         * 容错率
         */
        BloomFilter<String> bloomFilter =
                BloomFilter.create(Funnels.unencodedCharsFunnel(), 100, 0.00001);

        /**
         * 存储100个元素
         */
        IntStream.range(0,100).forEach((a) -> {
            bloomFilter.put(String.valueOf(a));
        });


        /**
         * 判断容错率
         */
        boolean b = bloomFilter.mightContain(1000 + "");
        int i = 1;


    }