布隆过滤器的原理学习

本文介绍了布隆过滤器的基本原理,包括其在网站黑名单和缓存穿透问题中的应用。布隆过滤器通过多个哈希函数将数据映射到二进制位图中,实现快速插入和查询。尽管它占用空间小,查询速度快,但存在误判风险和删除、修改数据的困难。

最近在看redis,看到了布隆过滤器,查了几篇文章之后就总结一下自己的学习,本文只是对基本原理做一个总结,代码分析在下一章《布隆过滤器的代码学习》

1、布隆过滤器概要

1、布隆过滤器简介

 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。(摘自百度百科)
 这是百度百科对于布隆过滤器的一个解释,在开了天眼分析过之后,我来通俗化一下这个解释。
 实际上布隆过滤器由两部分构成:
 1、 一个二进制向量,(可以把它理解成一个数组,里面存放的是1,0,0,1,1......这样的二进制数)。默认存储的是0。主要用于判断一个元素是否在一个集合中,0代表不存在某个数据,1代表存在某个数据。
 2、  一系列的哈希函数(随机映射函数)。

2、基本工作原理

主要用来对存储的数据做hash计算,得到对应的散列值,这个散列值就是这个值对应的在数组的位置下标,每一个hash函数做一次散列计算,得到这个要存储的值的一系列下标位置,然后把对应位置的数据里面的数据修改为1,表示该数据存储进入布隆过滤器。查询数据的时候只需要对数据做对应的散列计算,然后比对下标中的值,如果值全部为1则表示这个数据是存在布隆过滤器的,只要有一个为0,就表示布隆过滤器中没有该数据。这即是布隆过滤器的工作原理。

3、主要用途

我们已经知道,布隆过滤器是一个把查询数据放到数组中,进行筛选过滤的一个用途。那基于这个原理,我们可以解决一些问题。

1、 比如网站黑名单,我们就可以使用布隆过滤器去处理,先把你的黑名单网站使用布隆过滤器的规则存入二进制位图中,此后访问进来的网站,去布隆过滤器中去筛选,如果存在就禁止访问,否则就可以访问。
2、解决redis中的缓存穿透问题:此处再来复习一下什么叫缓存穿透。
缓存穿透:一个数据在redis缓存中不存在,而且在数据库中也不存在,此时访问过来,缓存中取不到,就去数据库中取,仍然取不到。此时如果请求数量过大,就会把请求压力全部打到数据库上,这就是缓存穿透。黑客可能通过不停的访问一个这样的数据造成数据库崩溃,系统崩溃。

2、探知布隆过滤器原理

探究一下布隆过滤器的原理,它是个过滤器,是存储的数据,相当于一个字典用于排查。我们对于数据一般只有增删改查四个操作,下面我们就从这四个方面去总结一下布隆过滤器。

1、新增方面:就是存入数据的过程

布隆过滤器上面说了,就是一个二进制数据的集合。当一个数据加入这个集合时,经历如下洗礼(这里有缺点,下面会讲):
通过N个哈希函数计算该数据,返回N个计算出的hash值
这些N个hash值映射到对应的N个二进制的数组下标
将N个下标对应的二进制数据改成1。
例如,第一个哈希函数返回x,第二个第三个哈希函数返回y与z,那么:X、Y、Z对应的二进制改成1。
在这里插入图片描述

2、查询方面

布隆过滤器的重点就在这里,它是一个排查工具说白了就是。在我们把数据在hash函数算出的下标中存入2进制数(其实就是1)作为基准数据。之后进来的数据就会使用布隆过滤器进行排查,具体步骤如下:

1、 通过N个哈希函数计算该数据,对应计算出的N个hash值;
2、通过hash值找到对应的二进制的数组下标;
3、如果存在一处位置的二进制数据是0,那么该数据不存在。如果都是1,该数据存在集合中。(这里有缺点,下面会讲)。

3、删除方面:

一般情况下,布隆过滤器不要轻易删除,这和它在存储的时候的一个漏洞有关系。下面会说。

4、修改方面:

修改库中数据,某种意义上就是删除,因为是个散列的,你修改势必会把原来的数据改动,这个时候也会因为存储的时候有漏洞而出一些问题。

3、布隆过滤器的优点和缺点

1、优点

1、由于存储的是二进制0,1数据,所以占用的空间小。

2、它的插入和查询速度是非常快的,时间复杂度是O(N),其实就是需要N个hash函数去计算N次,因 为hash散列的时间复杂度是O(1),N个函数可不就是O(N)。

3、保密性好,因为本身不存储任何原始数据,只有对应下标的二进制数据。

2、缺点本质

因为存储数据的时候,是经过N个hash函数计算的下标,再把下标对应的值改成1的。既然是hash函数,我们知道hash是存在冲突的,而且hash冲突不可避免,只能去降低解决冲突。
因为hash冲突的存在,所以两个不一样的数据在存入布隆的时候,可能会散列出一样的下标,从而把写入一样位置的二进制(1)数据,使得两个不一样的数据在布隆中的位置一样,这就导致无法判断具体这里存的是什么。
举个栗子:我们把孙悟空存入布隆,在几个散列之后,孙算出了下标1,悟算出6,行也算出6,空算出9,者也算出9.
此时,存储位置一样了。但是我们只是存入孙悟空,此时确在孙行者过来的时候也能找到位置,但是我们并没有存储孙行者,他却也被查到了,系统就把孙行者放过去了,就会造成危险。
这其实是hash函数选取不当造成的,但是很不幸,在数据结构中我们学过这种问题,不可避免。
在这里插入图片描述

原谅我不会用工具画图,就随手画了一个。

3、缺点

由此得出如下缺点:
一、存在误判
就像上述,布隆只存储了孙悟空,但是孙行者来的时候,因为hash值一样,使得孙行者也能找到位置在集合中,通过相同的hash值,找到的二进制数据也是一样的,都是1。这就会造成查询的错误。会被黑客利用这个攻击,要是hash简单,黑客一眼洞穿,就能以孙行者的身份进入系统。
二、删除困难
比如我们在布隆里存了孙行者,孙悟空都存进去了,此时想删除孙悟空
因为“孙悟空”和“孙行者”的hash值相同,对应的数组下标也是一样的。
这时候删除“孙悟空”,将下标为1,6,9里的二进制数据,由1改成了0。
此时就连“孙行者”一起删了。(0代表有这个数据,1代表没有这个数据)
三、修改困难(和删除一样)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值