布隆过滤器理解及实现

Posted by Jonliu on November 25, 2019

优缺点

  • 优点:
    • 空间效率和查询时间都远远超过一般的算法
  • 缺点:
    • 缺点是有一定的误识别率和删除困难。

应用场景

  • 1.去重
  • 2.避免缓存穿透

实现原理

BloomFiler又叫布隆过滤器,基本思想:

当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。。

举例说明:

比如你有10个Url,你完全可以创建一长度是100bit的数组,然后对url分别用5个不同的hash函数进行hash,得到5个hash后的值,这5个值尽可能的保证均匀分布在100个bit的范围内。

然后把5个hash值对应的bit位都置为1,判断一个url是否已经存在时,一次看5个bit位是否为1就可以了,如果有任何一个不为1,那么说明这个url不存在。这里需要注意的是,如果对应的bit位值都为1,那么也不能肯定这个url一定存在,这个是BloomFilter的特点之一,它有一定误判率,也可以通俗的理解为“宁可错杀,不可放过”。

举例

核心思想

  • 多个hash,增大随机性,减少hash碰撞的概率

  • 扩大数组范围,使hash值均匀分布,进一步减少hash碰撞的概率。

Python实现代码

BloomFilterRedis

参考