布隆过滤器的实现

布隆过滤器的实现


1.原理请参考:https://blog.csdn.net/jiaomeng/article/details/1495500

java实现
package com.ls.data.bloom;

import java.util.BitSet;

/**
 * Created by ls on 2021/3/9.
 *
 * @desc: 布隆过滤器的实现
 */
public class MyBloomFilter {

  // 初始化BitSet的大小
  private static final int DEFAULT_SIZE = 2 << 24;

  // 使用质数数组
  private static final int[] ARR = {5, 7, 11, 13, 31, 37, 61};

  private static final BitSet BIT_SET = new BitSet(DEFAULT_SIZE);

  public static boolean check(Object value) {
    if (null == value) {
      return false;
    }
    boolean flag = true;
    for (int ar : ARR) {
      flag = flag && BIT_SET.get(hash(value, ar));
    }
    return flag;
  }


  public static void add(Object value) {

    for (int ar : ARR) {
      BIT_SET.set(hash(value, ar), true);
    }
  }


  private static int hash(Object value, int item) {
    int ha;
    item = item * (DEFAULT_SIZE - 1);
    return (value == null) ? 0 : (item & ((ha = value.hashCode()) ^ (ha >>> 16)));
  }

  
  public static void main(String[] args) {
    MyBloomFilter bloomFilter = new MyBloomFilter();
    bloomFilter.add("张学友");
    System.out.println(bloomFilter.check("张学友"));
    System.out.println(bloomFilter.check("刘德华"));

//插入数据
    for (int i = 0; i < 10000000; i++) {
      bloomFilter.add(i);
    }
    int count = 0;
    for (int i = 10000000; i < 20000000; i++) {
      if (bloomFilter.check(i)) {
        count++;
        System.out.println(i + "误判了");
      }
    }
    System.out.println("总共的误判数:" + count);
  }
}

Guava的实现
/**
 * Created by ls on 2021/3/9.
 *
 * @desc:
 */
public class GuavaBloomTest {

  private static int size = 100000000;//预计要插入多少数据

  private static double fpp = 0.00001;//期望的误判率

  private static BloomFilter<Integer> bloomFilter = BloomFilter
      .create(Funnels.integerFunnel(), size, fpp);

  public static void main(String[] args) {
//插入数据
    for (int i = 0; i < 10000000; i++) {
      bloomFilter.put(i);
    }
    int count = 0;
    for (int i = 10000000; i < 20000000; i++) {
      if (bloomFilter.mightContain(i)) {
        count++;
        System.out.println(i + "误判了");
      }
    }
    System.out.println("总共的误判数:" + count);
  }

}

redis的实现
setbit key offset value 

在这里插入图片描述

getbit key offset 

在这里插入图片描述

在这里插入图片描述
参考:https://www.cnblogs.com/ysocean/p/12594982.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值