布隆过滤器

本文介绍了如何利用Google Guava库中的BloomFilter实现高效的布隆过滤器,用于大数据量场景下的数据存在性判断。通过设置合适的参数,可以在保证较低误杀率的同时,减少内存占用。代码示例展示了创建过滤器、添加数据、检查数据及性能测试的过程,强调了时间和空间效率与误杀率之间的权衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过K个散列函数把数据分布在位数组bitmap上,并置位1,当查询的时候同样的算法看是否分布在位1的数组上。只要有个不为1,则不存在。不会误杀,但是可能会有漏网之鱼通过布隆过滤器(可以通过设置fpp来控制)。

maven

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>

package com.xdf.xcloud.api.utils;

import java.time.Duration;
import java.time.LocalDateTime;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class TestBloomFilter {

    private static int total = 1000000;
//    private static BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), total);
    private static BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.01);

    public static void main(String[] args) {
        // 初始化1000000条数据到过滤器中
    	LocalDateTime now = LocalDateTime.now();
        for (int i = 0; i < total; i++) {
            bf.put(i);
        }

        // 匹配已在过滤器中的值,是否有匹配不上的
        for (int i = 0; i < total; i++) {
            if (!bf.mightContain(i)) {
                System.out.println("误杀");
            }
        }

        // 匹配不在过滤器中的10000个值,有多少匹配出来
        int count = 0;
        for (int i = total; i < total + 10000; i++) {
            if (bf.mightContain(i)) {
                count++;
            }
        }
        System.out.println("漏网的数量:" + count);
        LocalDateTime now2 = LocalDateTime.now();
        Duration between = Duration.between(now, now2);
        System.out.println(between.toMillis());
    }

}

成功率可以达到100,只要fpp设置的够低。但是时间和bitmap空间消耗就越大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值