java简单实现布隆过滤器

java代码实现

为了方便理解布隆过滤器,java简单实现了下,
特点:仅用做一次运算就可以判断存在不存在,但是只能精确的判断值不存在,不能精确的判断值存在
,实际使用中可以用redis或者guava的实现

public class BlTest {
    private final int f = 1024; // 负载因子,值越大判断的越精准,但是所占的空间也越大
    int[] bArray;
    BlTest(){
        this.bArray=new int[f];
    }
    void addKey(String s){
        int i = s.hashCode() % f;// 不同字符串取模后的值可能相同,所以会存在哈希碰撞。
        if(bArray[i]!=1){
            bArray[i]=1;
        }
    }
    boolean exists(String s){
        return bArray[s.hashCode() % f]==1;
    }
    public static void main(String[] args) {
        BlTest blTest = new BlTest();
        blTest.addKey("10068");
        blTest.addKey("123456");
        System.out.println(blTest.exists("10086"));
        System.out.println(blTest.exists("123456"));
        System.out.println(blTest.exists("10010"));
    }

}

redis实现

  @Autowired
    private Redisson redisson;

    @GetMapping("/test")
    public AjaxJson test() {
        RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");
                //初始化布隆过滤器:预计元素为100000000L,误差率为3%
                 bloomFilter.tryInit(100000000L,0.03);
                 //将号码10086插入到布隆过滤器中
                 bloomFilter.add("10086");
                 //判断下面号码是否在布隆过滤器中
                 System.out.println(bloomFilter.contains("123456"));//false
                 System.out.println(bloomFilter.contains("10086"));//true
        return AjaxJson.success();
    }

guava 实现

   BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),100000,0.01);
                bloomFilter.put("10086");
               System.out.println(bloomFilter.mightContain("123456"));
               System.out.println(bloomFilter.mightContain("10086"));

posted @ 2023-05-31 11:30  猥琐熊花子酱  阅读(184)  评论(0编辑  收藏  举报