布隆过滤器
- 布隆过滤器(Bloom Filter) 是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中
- 它的优点是空间效率和查询时间都远超过一般的算法,缺点是有一定的误识别率和删除困难
原理
- 布隆过滤器使用位数组(bit array)和一系列的哈希函数
- 当你向布隆过滤器中添加一个元素时,布隆过滤器会使用多个哈希函数对这个元素进行哈希计算,得到一系列哈希值,然后将这些哈希值对应的位数组中的位设置为1
- 当需要查询一个元素是否存在于布隆过滤器中时,同样使用这些哈希函数对元素进行哈希计算
- 如果所有哈希值对应的位都是1,那么认为该元素存在于布隆过滤器中
- 如果有任何一个哈希值对应的位是0,那么认为该元素不存在于布隆过滤器中
- 需要注意的是,布隆过滤器可能会产生误报,即认为某个不存在的元素存在于过滤器中
- 这是因为不同的元素可能通过哈希计算得到相同的哈希值,导致它们的位都被设置为1
- 但是,布隆过滤器不会产生漏报,即如果某个元素确实存在于过滤器中,那么查询结果一定会返回存在
Python中实现布隆过滤器
from pybloom_live import BloomFilter
# 创建一个能容纳1000个元素,误报率为0.01的布隆过滤器
bf = BloomFilter(capacity=1000, error_rate=0.01)
# 向布隆过滤器中添加元素
bf.add("apple")
bf.add("banana")
bf.add("orange")
# 查询元素是否存在于布隆过滤器中
print(bf.add("apple")) # 输出:True 表示元素存在
print(bf.add("grape")) # 输出:可能是False,也可能是True(由于误报率的存在)
# 注意:布隆过滤器不支持删除元素
Scrapy默认过滤器
默认过滤器一般位于:
Python\Lib\site-packages\scrapy\dupefilters.py
dupefilters.py
文件下的RFPDupeFilter
类
默认过滤器配置文件:
# settings.py
DUPEFILTER_CLASS = "scrapy.dupefilters.RFPDupeFilter"