简述布隆过滤器的实现思路:
假设有一个长度为n的比特数组,bit_array,数组里的每一位都是0,对于一个url或者是其他数据,使用hash算法计算出url的散列值,这个散列值当然是一个整数,暂且命名为index,index=index%n,确保index的值小于n,查看bit_array[index]是否等于1,如果等于1,表示该url已被抓取过了,如果等于0,则表示还没有被抓取,让爬虫程序取抓取这个url,同时设置bit_array[index]=1.
当url非常多了以后,必然会发生碰撞,即两个不同的url经过hash处理后得到相同的散列值,这就麻烦了,两个url,有一个被误判,明明没有被抓取过,但比特数组里已经记录了它。
如何解决碰撞,布隆过滤器的方法很暴力,用多个hash,这样就会产生多个散列值,这些散列值所对应的索引位置均设置为1,虽然依然会发生碰撞,但是这些位置都发生碰撞的概率就降低了。
影响效果的三个因素:
比特数组的长度
错误率
hash的次数
布隆过滤器可以视为一个特殊的集合,它不能存储具体的值,它只能表示某个值是否在集合中,而且,它有一定的错误率,布隆过滤器说某个值不存在,那么就一定不存在,说某个值存在,则有一定的概率是错的。
查阅资料,有一个库可以来实现布隆过滤器,mmh3
安装方法:pip install mmh3
标签:index,hash,散列值,--,redis,布隆,url,过滤器 From: https://www.cnblogs.com/99kol/p/17466473.html