搞一搞布隆过滤器
1. 布隆过滤器
顾名思义,它是一个过滤器,发明它的人叫布隆,1970年提出的。
布隆过滤器实际上是一个数据结构,是一个很长的二进制向量和一系列随机映射函数,它是用来检索一个元素是否在这个集合中的。
在如今数据量巨大的情况下,布隆过滤器具有很好的空间效率和时间效率,一般布隆过滤器只有两个功能,insert和isExist。
2. 介绍
当插入数据时不会关心他的索引值,也就是不关心插入项和索引值的关系。但是我们想要判断数据在一个数据项存不存只能通过遍历的方法。那如果时数据量很大的时候呢?遍历就会显着捉襟见肘了,因此索引值才是判断对象是否存在的最好办法。
如同HashMap一般,利用Hash表来计算出索引值。这就意味着索引值是由插入项来决定,布隆过滤器就是通过函数来计算索引值,进而判断是否存在,这样速度非常快。
根据布隆过滤器可以知道,元素可能在集合中或者不在集合中。因为布隆过滤器是通过多个函数计算来判断对应bit为上是否为存在位,如果都是存在位,则可能存在,反则有一个没有落在存在位,则肯定不存在。
3. 为什么说可能存在
布隆过滤器的误差率和哈希的次数、已添加元素的数量、布隆过滤器的长度有关。
- 下面是布隆过滤器的误差值计算公式
- 布隆过滤器的长度m可以根据给定的误判率和期望添加的元素个数n计算出来
n -> 已添加元素数量
k -> hash次数
m -> 布隆过滤器的长度
4. 布隆过滤器优缺点
1. 优点
- 它的优点是空间效率和查询时间都比一般的算法要好的多
- 布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势
2. 缺点
- 上面已经计算过,他有一定的误差率
- 布隆过滤器仅支持insert和isExist操作,而没有delete操作
5. 布隆过滤器应用
- python爬虫爬网页时,确定哪些网页已经爬过,进行去重
- 黑名单业务处理,判断是否处于黑名单
- 使用布隆过滤器防止恶意URL
- 通过布隆过滤器减少不必要的查找
- 解决缓存穿透
- 查询加速
- 判断集合重复元素