redis-布隆过滤器原理

参考:
http://imhuchao.com/1271.html
https://www.cnblogs.com/zhanggguoqi/p/10571225.html

作用
判断某个值是否在某个集合中。

特点
1、存储空间小:
因为它的原理是由一个长度为m的位数组(二进制向量),一个字节有8个位,如果我们使用四个hash函数来运算,那么每个key就会占用四个位,一个字节可表示两个key。相比于原来的一个字符需要一个字节来存,如果一个key有30个字符,那就是30个字节了,可见Bloom Filter显著缩短了空间。

2、写入的过程:O(1)
分别让key经过四个hash函数,假如结果为123,33333,456,78906,那么就去位数组上以他们为index,找到对应的位置,将值设置为1。因为hash函数的值可能相同,为了降低了冲突的概率,需要用多个hash函数。

3、判断速度快:O(1)
Bloom FIlter的查找过程是,假如使用了四个hash函数(运算结果都是整数),遍历,对key执行hash运算,假如得到3000, 这个整数就是位数组上特定位置,位数组的值只有0和1,如果是0,就可以明确判断为不存在,其他hash函数没必要执行了,如果为1,接着执行,值为0就可以中断了,如果都是1,可以近似判断为存在,因为这是个只有四个样本的概率判断。由于直接通过Index来查找的,根本不需要遍历整个集合,效率极高。

4、结果:
如果判断为不存在,那么一定不存在;如果判断为存在,那么大概率是存在的。

5、缺点:
有一定的错误概率,当集合中的元素越来越多,二进制序列中的1的个数越来越多的时候,判断一个字符串是否在集合中就很容易误判,原本不在集合里面的字符串会被判断在集合里面。

节点删除困难,因为不同的key对应hash函数的结果可能相同,构成冲突,所以你不能简单的将四个hash函数结果对应的位置置为0的方式来表示你删除了这个key。

6、参数设置
我们预估要存的数据量为n,期望的误判率为p
1、位数组长度m
m = -nlnp / ( (ln2)^2 )

2、hash函数个数选组
k = mln2 / n

3、寻找hash函数
比如BKDRHash,JSHash,RSHash等等

redis-布隆过滤器原理_第1张图片

你可能感兴趣的:(PHP,Redis)