HBase学习笔记(三)——布隆过滤器(Bloom Filter)的原理

本文介绍了布隆过滤器的基本原理,包括其利用哈希函数和位数组实现的概率型查找机制。重点讲述了它的优点(空间效率高、查询快、适合低精度场景)、缺点(存在误判率、不支持删除)及典型应用场景,如缓存穿透防护和数据去重。
摘要由CSDN通过智能技术生成

布隆过滤器介绍

    布隆过滤器(Bloom Filter)由 Burton Howard Bloom 在 1970 年提出,是一种空间效率高的概率型数据结构。它专门用来检测集合中是否存在特定的元素。

布隆过滤器带有以下特点:

  • 一个很长的二进制向量(位数组)
  • 一系列随机函数(哈希)
  • 空间效率和查询效率高
  • 有一定的误判率(哈希表是精确匹配)

布隆过滤器原理

布隆过滤器(Bloom Filter)的核心是实现一个超大的位数组和几个哈希函数
布隆过滤器原理图
    假设位数组的长度为m,哈希函数的个数为k,以上图为例。
具体操作流程如下:

  1. 假设集合里面有3个元素 {x,y,z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置为0。
  2. 对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。
  3. 查询 W 元素是否存在集合中的时候,同样的方法将 W 通过哈希映射到位数组上的3个点。
  4. 如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。 反之,如果3个点都为1,则该元素可能存在集合中。
  5. 注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。
  6. 可以从图中可以看到:假设某个元素通过映射对应下标为4、5、6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在稽核中,也可能对应的都是1,这是误判率存在的原因。

布隆过滤器添加元素

  • 将要添加的元素给k个哈希函数
  • 得到对应于位数组上的k个位置
  • 将这k个位置设为1

布隆过滤器查询元素

  • 将要查询的元素给k个哈希函数
  • 得到对应于位数组上的k个位置
  • 如果k个位置有一个为0,则肯定不在集合中
  • 如果k个位置全部为1,则可能在集合中

布隆过滤器的优缺点与用途

优点

  • 不需要存储数据本身,只用比特表示,因此空间占用相对于传统方式有巨大的优势,并且能够保密数据;
  • 时间效率也较高,插入和查询的时间复杂度均为O(k);
  • 哈希函数之间相互独立,可以在硬件指令层面并行计算。

缺点

  • 存在假阳性的概率,不适用于任何要求 100% 准确率的场景;
  • 只能插入和查询元素,不能删除元素,这与产生假阳性的原因是相同的。我们可以简单地想到通过计数(即将一个比特扩展为计数值)来记录元素数,但仍然无法保证删除的元素一定在集合中。

    所以,Bloom Filter 在对查准度要求没有那么苛刻,而对时间、空间效率要求较高的场合非常合适,本文第一句话提到的用途即属于此类。另外,由于它不存在 假阴性 问题,所以用作“不存在”逻辑的处理时有奇效,比如可以用来作为 缓存系统(如Redis)的缓冲,防止缓存穿透。

布隆过滤器使用场景

使用场景描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo825...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值