目录

BloomFilter布隆过滤器

布隆过滤器原理

布隆过滤器就是通过 3个hash函数,当然hash函数的数量不限,hash函数越多判断越准确,但是同时消耗也越大

将值进行一个hash,计算出对应的index,然后设置对应的bitmap

查找的时候再将值进行hash,分别查找对应的bitmap的位数是否为1,,如果都为1那么则表示找到,如果有一个不为1则表示不存在

BloomFilter 的缺点就是发生hash碰撞之后会出现误判的情况 ,也就是说有可能多个值都映射到相同的位置,所以如果判断出元素存在的话还需要进一步到真实的数据中去再次确认元素是否存在,但是如果判断出不存在,则肯定是不存在

同时布隆过滤器也有 删除问题,也就是说如果删除了一个值,那么其对应的bitmap就要置为0 ,但是如果和他产生hash碰撞的值也都无法判断了,比如原来本来存在的值其中一位和删除的值的bit位一样,但是被删除了,那么判断这个值得时候就会误判为不存在

综上,我们得出 BloomFilter 的主要作用如下:

  • 一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在
  • 布隆过滤器可以添加元素,但是不能删除元素

BloomFilter的应用场景

  1. 网页爬虫对URL的去重,避免爬取相同的URL地址;

  2. 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱;

  3. 防止缓存击穿,将已存在的key放到布隆过滤器中,当访问不存在的缓存时迅速返回避免去真实的数据库查询缓存,这样如果黑客暴力故意查询一个不存在的键时也不会打到后台真实的服务器上而是直接在BloomFilter缓存中就已经判断出不存在了

BloomFilter的实现

TODO

布谷鸟过滤器

布谷鸟过滤器是布隆过滤器的升级版,其支持删除操作并且不影响判断,我在github上找到了一个实现

https://github.com/linvon/cuckoo-filter/blob/main/cuckoofilter.go

参考

https://developer.aliyun.com/article/773205 【布隆过滤器,这一篇给你讲的明明白白】

https://segmentfault.com/a/1190000039156246 【布隆,牛逼!布谷鸟,牛逼!】讲的不错