redis实现布隆过滤器,Redis布隆过滤器
6 SPRedis布鲁姆过滤器
根据以下说明描述如何实现redis Bloom过滤器:
首先构造n个哈希方法,每个哈希方法字符串到key值的映射公式为:key=(i * keys s)% mod,其中key从0开始,s是字符串中每个字符的ASCII值,I是哈希方法的个数(从1开始),mod是每个方法对应的随机数,取值范围为10000-20000。
实现add函数,给Bloom filter添加一个字符串:使用每个构造的hash方法,得到N个键值,标记对应的键值。
实现contains函数检查给定的字符串是否在Bloom filter中:检查每个hash方法的键值是否有标记。
输入字符串数组s1意味着首先将这些字符串添加到布隆过滤器中,然后检查字符串数组s2中的字符串是否在布隆过滤器中。
示例1输入:
[牛],[牛,牛,牛],3返回值:
[0,0,1,0]描述:
0表示不在Bloom filter中,1表示Bloom filter中问题的解决方案很模糊,让人无从下手。可以先看看Bloom filter的原理,再做题。
想法:
用n个hash函数为每个字符串生成一个key,然后将key值对应的位设为1遍历第二个输入数组,用同一个hash函数为它生成对应的key,然后判断对应的位是否为真。只要有一位不为真,就说明该字符不存在。解释:
我在这里偷懒了,因为题目只说了mod范围是10000 ~ 20000,没有说明每个哈希函数的mod。题目说是随机的,这里直接写成了一万,但是不影响最后的结果~ ~ ~
代码很简单,如下所示:
#包含位/标准数据。h
使用命名空间std
long generate_key(int i,long mod,const std:string str)
{
长键=0;
for(自动s : str)
{
key=(I * key s)% mod;
}
回车键;
}
向量int BloomFilter(向量字符串s1,向量字符串s2,int n)
{
STD:bit set 10000 bs;
长mod=10000
用于(自动s : s1)
{
for(int I=1;I=n;我)
{
long key=generate_key(i,mod,s);
bs.set(键);
}
}
STD:vector int ans;
用于(自动s : s2)
{
int flag=1;
for(int I=1;I=n;我)
{
long key=generate_key(i,mod,s);
如果(!bs[键])
{
flag=0;
打破;
}
}
ans . push _ back(flag);
}
返回ans
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。