快速了解布隆过滤器

一. 什么是布隆过滤器

本质: 一种数据结构, 一种比较巧妙的概率性数据结构
特点: 高效地插入和查询. 
作用: 判断数据存在与否
    
优势: 对比传统的list,set,map数据接口, 更高效, 占用空间更少
劣势: 具有概率性, 不确切

二. 实现原理

布隆过滤器数据结构

img

当需要映射一个值到布隆过滤器中步骤

  1. 使用多个不同的哈希函数生成多个哈希值
  2. 多个生成的哈希值指向不同的bit位置

例如: 针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7

例如: 针对值 “tencent” 和三个不同的哈希函数分别生成了哈希值 3、4、8

值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

三. 选择哈希函数个数和布隆过滤器长度

注意:

过小的布隆过滤器很快所有的bit位均为1, 那么查询的任何值会都返回“可能存在”, 因此这样就起不到过滤的目的了.

如何降低布隆过滤器的错误率?

1. 提升不容过滤器长度: 布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小
2. 控制哈希函数的个数: 哈希函数个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,那我们的误报率会变高。

如何选择合适业务的k(哈希函数个数)和m(布隆过滤器长度)?

提示: n 为插入的元素个数,p 为误报率

参考: https://www.jianshu.com/p/2104d11ee0a2

posted @ 2020-08-16 11:32  给你加马桶唱疏通  阅读(154)  评论(0编辑  收藏  举报