什么是布隆过滤器?
它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
布隆过滤器的原理?
通过一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了
布隆过滤器如何解决哈希冲突的
解决方法就是使用多个Hash函数,如果它们有一个说元素不在集合中,那肯定就不在。(如果都存在,可能是出现了hash碰撞,但是几率比较小)
bbbb.png如上图,如果我们需要判断某个字符串是否在布隆过滤器中时,只需要对给定字符串再次进行相同的哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1(假设我们的bit数组足够大,没有出现hash碰撞),那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。
应用场景:
1.解决缓存穿透,快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
2.判断给定数据是否存在:比如判断一个数字是否在于包含大量数字的数字集中
3.邮箱的垃圾邮件过滤、黑名单功能
4.去重:比如爬给定网址的时候对已经爬取过的 URL 去重。
布隆过滤器的缺点
bloom filter之所以能做到在时间和空间上的效率比较高,是因为牺牲了判断的准确率、删除的便利性
1.存在误判,可能要查到的元素并没有在容器中,但是hash之后得到的k个位置上值都是1。如果bloom filter中存储的是黑名单,那么可以通过建立一个白名单来存储可能会误判的元素。
2.删除困难。一个放入容器的元素映射到bit数组的k个位置上是1,删除的时候不能简单的直接置为0,可能会影响其他元素的判断。