BloomFilter(大数据去重)+Redis(持久化)策略 - Go语言中文社区

BloomFilter(大数据去重)+Redis(持久化)策略


BloomFilter(大数据去重)+Redis(持久化)策略

BloomFilter(大数据去重)+Redis(持久化)策略

背景

之前在重构一套文章爬虫系统时,其中有块逻辑是根据文章标题去重,原先去重的方式是,插入文章之前检查待插入文章的标题是否在ElasticSearch中存在,这无疑加重了ElasticSearch的负担也势必会影响程序的性能!

BloomFilter算法

思想

位数组k个散列函数

  1. 位数组
    初始状态时,BloomFilter是一个长度为m的位数组,每一位都置为0。
    这里写图片描述
  2. 添加元素(k个独立的hash函数)
    添加元素时,对x使用k个哈希函数得到k个哈希值,对m取余,对应的bit位设置为1。
    这里写图片描述
  3. 判断元素是否存在
    判断y是否属于这个集合,对y使用k个哈希函数得到k个哈希值,对m取余,所有对应的位置都是1,则认为y属于该集合(哈希冲突,可能存在误判),否则就认为y不属于该集合。
    图中y1不是集合中的元素,y2属于这个集合或者是一个false positive。
    这里写图片描述
    BloomFilter有以下参数:

问题:如何根据输入元素个数n,确定位数组的大小m和哈希函数的个数k?

BloomFilter的f满足下列公式:
这里写图片描述
在给定m和n时,能够使f最小化的k值为:
这里写图片描述
此时给出的f为:
这里写图片描述
根据以上公式,对于任意给定的f,我们有:
这里写图片描述
同时,我们需要k个hash来达成这个目标:
这里写图片描述
由于k必须取整数,我们在Bloom Filter的程序实现中,还应该使用上面的公式来求得实际的f:
这里写图片描述
以上3个公式是程序实现Bloom Filter的关键公式。
故可以通过调节参数,使用Hash函数的个数,位数组的大小来降低失误率


k和m的取法:

这里写图片描述

这里写图片描述 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chai19921206/article/details/81026834
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢