引言
在海量数据面前如何去过滤,及查找数据。下面有几个问题:
-
总共有50亿个电话号码,现在已经知道10万个号码,如何在这100亿个电话号码中去快速判断这些10万个号码是否存在?
-
垃圾邮件过滤。
3.wps文字处理软件错误单词的检测。
-
网络爬虫重复URL检测。
-
Hbase行过滤器。
上面的问题都有一些特点,数据量很大,并且要在海量数据中查找其中几条或者部分数据。看看常规的解决方法及问题: -
所有数据放在数据库,通过数据库查询,但是实现快速查询有点困难。
-
数据全部放在集合里,数据所占空间:50亿 * 8字节 = 大约40G,内存浪费而且数据量更大内存空间不一定够。
-
Redis的hyperloglog,查询不够准确。
当数据量较小,内存又足够大时,使用hashMap或者hashSet等结构就好了。但是如果当这些数据量很大,数十亿甚至更多,内存装不下且数据库检索又极慢的情况,在1970年伯顿.布隆就提出了可以用很小的空间来解决上面那些类似问题。
布隆过滤器基本原理
用一个很长的二进制向量( 也可以理解成bit数组)和若干个哈希函数,这些哈希函数通过计算你要找到的值是否映射在这个二进制向量中。
布隆过滤器初始化的时候bit数组里的值都是0.
当我们将一个元素加入布隆过滤器中的时候,会进行如下操作:
-
使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(