布隆过滤器

       Bloom Filter 其实是一个很长的二进制矢量和一系列随机映射函数。他能够用来判断一个元素是否在一个集合中。他的优点是只占用很小的内存空间以及有着高效的查询效率。数据库

      对于布隆顾虑器而言,它的本质是一个位数组,位数组的每个元素都是只占一bit,并且元素只能是0或者1。一开始,布隆过滤器的位数组全部位初始化都是0.好比,数组长度为m,那么长度为m的数组全部的位都初始化为0.数据中的每位都是二进制位。网页爬虫

      布隆过滤器除了一个数组,还有K个哈希函数。当一个元素加入布隆过滤的时候,会进行以下操做:数组

      1.使用K个哈希函数对元素进行K次计算,获得K个哈希值。缓存

      2.根据获得的哈希值,在位数组中把对应的下表值的值置位1.服务器

      当判断一个值是否在布隆过滤器中,对元素进行k次哈希计算,获得值以后判断位数组中每一个元素是否都为1,若是值都为1,那么说明这个值在布隆过滤器中,若是存在一个值不为1,说明该元素不在布隆过滤器中。函数

         布隆过滤的一个缺陷:存在误判。内存

        很显然,数组的容量再大,也是有限的。当随着元素的增长,插入元素机会愈来愈多,位数组为1的位置所以也愈来愈多,就会形成一个不在布隆过滤器中在元素,进过一样规则的哈希计算以后,获得的值在位数组中查询,有可能这个位置由于以前其余元素的操做都为1了。it

        补救方法:效率

        布隆过滤器存在必定的误识别率,常见的补救方法是创建白名单,存储那些可能被误判的元素。二进制

         使用场景:

         1.网页爬虫对URL的去重,避免爬取相同的URL地址。

         2.进行垃圾邮件过滤:反垃圾邮件,从数十亿的垃圾邮件列表中判断某邮箱是否垃圾邮箱。

         3.有的黑客为了让服务宕机,他们会构建大量不存在于缓存中的key,向服务器发起请求,在数据量足够大的状况下,频繁的数据库查询可能致使DB挂掉。布隆过滤器很好的解决了缓存击穿的问题。

相关文章
相关标签/搜索