布隆过滤器笔记

一、布隆过滤器是什么?

什么是布隆过滤器?
布隆过滤器是一种能够检索元素是否在海量数据集合下的数据结构,如果存在的话,那么给你返回信息,如果存在那么返回1,如果不存在就返回0,然后布隆过滤器是通过位数组进行维护的,也就是数组里面的元素只能是二进制状态0或者1,基于此,那么布隆过滤器就能够存取大量的数据,然而它却并不耗内存。

比如你玩布隆过滤器里面存储100个元素的数据,那么实际占用的内存空间只有120kb左右,换算一下就是说100万数据,就是100万bit,然后把100万的bit换算成byte需要换算成kb,这两部都需要除以1024,1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb

由于它并不耗费空间,所以能够支持高效的查询与检索,然而有一个问题,并不一定能够保证每次查询到的数据都是准确的,因为当你布隆过滤器当中存在海量的数据的情况下,它里面有一个容错率的概念,也就是说可能会存在误查的情况,返回的数据并不一定正确,然后如果要删除数据也比较麻烦。

一旦查询到了,不一定正确,因为小概率误判可能发生,如果没有查询到,就一定不存在布隆过滤器当中。

二、布隆过滤器的原理

1.添加

当你需要往里面添加元素的时候,先拿到你这个元素,通过hash函数进行一个运算,判定你这个元素需要存放到哪个位置(有多个hash函数,有可能一个元素需要经过多个不同的hash函数的运算),进而在这个数组当中,不同的位置可能存放相同的值。然后一旦存放进去了,那么对应的位置值置为1。

2.判断

如果是查询某个元素是否在布隆过滤器当中,还是一样的逻辑,先根据你这个元素,通过hash函数计算一下,然后你得到了一个值,然后布隆过滤器就会拿着这个值,去某个位置看下是否有,如果是1,代表有,如果是0,代表没有。

ps:不过有一点需要注意的是,有可能不同的元素,他们经过hash函数运算之后,得到的是相同的值,这是我们不想看到的,那么基于此,我们需要适当的扩大数组,或者调整一下hash函数。

三、使用场景

  1. 可以用来判断某个数据是否存在海量数据的数组当中,防止缓存穿透(请求的key一过来,先经过布隆过滤器,如果不存在,直接返回错误,如果存在,那么才会去查缓存。)
  2. 去重,在爬虫里面,可以判断给定的网址是否已经爬过了,如果爬过了,那我就不爬这个网址了。

四、java实现布隆过滤器

  1. 需要有一个bit数组,定义一个默认的大小,2左移24位
  2. 构建不同的hash函数,定义一个数组seeds,里面放不同的值
  3. 创建一个添加元素进bit数组的方法
  4. 创建一个查询元素是否在数组中的方法
  5. 创建一个静态内部类,用于定义hash函数的具体计算过程

具体如下,其实也是借鉴别人的哈!

import java.util.BitSet;
public class MyBloomFilter {
   

    /**     * 位数组的大小     */
    private static final int DEFAULT_SIZE = 2 << 24;
    /**     * 通过这个数组可以创建 6 个不同的哈希函数     */
    private static final int[] SEEDS = new int[]{
   3, 13, 46, 71, 91, 134};

    /**     * 位数组。数组中的元素只能是 0 或者 1     */
    private BitSet bits = new BitSet(DEFAULT_SIZE);

    /**     * 存放包含 hash 函数的类的数组     */
    private SimpleH
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值