布隆过滤器BloomFilter——手写+guava包分别实现

前言:

java入行很多年了,今天开始分享技术,摸摸渐疏的刘海,划船不靠浆,全靠一个浪,对就是我信小白,大家共勉!

原理:

通俗易懂语言来描述一下(可能有误解):

  1. BloomFilter 就是一个大的HashSet, 里面存的值都是0;
  2. 存入一个值,通过hash解析,并映射在hashset 不同的位置,并把这些位置的0修改为1
  3. 检验另一个值,通过hash解析,判断hashset这些位置上是否都为1,都为1则存在;

bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。

算法:

  1.  首先需要k个hash函数,每个函数可以把key散列成为1个整数
  2.  初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
  3.  某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
  4.  判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。

一、手写java布隆过滤器

问题:布隆过滤器会不会满,会有很多人忽略了这一点

废话不多少直接上代码

/**
 * 布隆过滤器
 *
 * @author 信小白
 * @date created 2020/7/27 18:11
 * @since 1.0
 */
public class BloomFilterUtil implements Serializable {
    // 数组
    private final int[] seeds;
    // 大小
    private final int size;
    // set的计划
    private final BitSet notebook;
    private final MisjudgmentRate rate;
    private final AtomicInteger useCount = new AtomicInteger();
    private final Double autoClearRate;


    /**
     * 默认中等程序的误判率:MisjudgmentRate.MIDDLE 以及不自动清空数据(性能会有少许提升)
     *
     * @param dataCount 预期处理的数据规模,如预期用于处理1百万数据的查重,这里则填写1000000
     */
    public BloomFilterUtil(int dataCount) {
        this(MisjudgmentRate.MIDDLE, dataCount, null);
    }

    /**
     * @param rate          一个枚举类型的误判率
     * @param dataCount     预期处理的数据规模,如预期用于处理1百
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值