Algorithm 基于字符的bloomfilter

Algorithm 基于字符的bloomfilter,algorithm,hash,bloom-filter,Algorithm,Hash,Bloom Filter,我是布卢姆过滤器的新手。我了解如何用位数组实现Bloom过滤器,我们用k个哈希函数散列值x,并将每个位数组索引设置为1 但我想知道我们将如何实现带有字符数组的Bloom过滤器?尤其是当输入是字符串时。我能想到的一种方法是,将字符串中每个字符的ASCII值相加,然后将该值散列,然后将字符数组的索引设置为某个值(如果我使用此方法,我也不确定在字符数组中设置什么值,因为它不能仅为0或1,因为我们不使用位数组),但误报的概率将非常高。有人能给我一些开始的想法吗?(我不需要实际的代码,但我真的很感激,如果

我是布卢姆过滤器的新手。我了解如何用位数组实现Bloom过滤器,我们用k个哈希函数散列值x,并将每个位数组索引设置为1


但我想知道我们将如何实现带有字符数组的Bloom过滤器?尤其是当输入是字符串时。我能想到的一种方法是,将字符串中每个字符的ASCII值相加,然后将该值散列,然后将字符数组的索引设置为某个值(如果我使用此方法,我也不确定在字符数组中设置什么值,因为它不能仅为0或1,因为我们不使用位数组),但误报的概率将非常高。有人能给我一些开始的想法吗?(我不需要实际的代码,但我真的很感激,如果你能给我一些了解哈希函数使用和如何将它们映射到char数组)

你可以使用一些哈希算法,将哈希算法转换成一个整数哈希,然后把它的每一位看作是位数组或字符数组的一部分。p>
hash(S)=sum(S[i]*(p^i))_i=0 to n-1.
您可以使用此散列2次以减少误报的机会。这会给你一个合理的行为

另外,
p
的选择必须限制为素数,且应大于字母表集中的字符数

  • 这将提供比简单的ascii值相加更好的结果
另一件奇怪的事情是,所使用的哈希函数应该是独立且均匀分布的

速度也是另一个标准,这就是为什么标准加密哈希不是好的选择。(如sha1)

我听说的一种标准散列方法是
杂音散列
,您可以尝试使用它并与预期结果进行比较

明确您将如何实施它:-

可以考虑多个散列函数,如<代码>咕哝<代码> >代码> fnv1a < /代码> 即使是我提出的简单的一个,然后你从每个得到3个值 搞砸把它们放在适当的位置。然后,这将起到同样的作用 你的布卢姆过滤器

在这里,当您实现不同的哈希函数时,误报的概率将取决于多个哈希函数,从而产生更好的结果

例如:

您想要散列
stackoverflow
。现在您使用3个散列函数,它们给出数字11、45和17。您将保留一张地图,用于放置此值

{
   11: 1,
   45: 1,
   17: 1
}
再次以这种方式进行散列,得到值11、15和97

然后你会把它改成

{
  11: 1,
  15: 1,
  17: 1,
  45: 1,
  97: 1
}
注意:我在这里提到了map…它可以是位数组之类的东西,也可以在其中设置位。例如……在……的情况下
stackoverflow
11、17和45位将设置为1

注意:此映射将帮助您回答是否存在元素的查询

现在在查询的情况下,您将执行相同的操作,获取哈希值并检查这些值是否存在。如果答案是肯定的,那么它很有可能存在(不完全是假阳性),如果答案不是肯定的


假设现在您将检查字符串“abcd”是否存在。应用前面使用的3个哈希函数。结果是11,99,55。您将检查它们是否全部存在。你可以看到55不在那里。所以字符串“abcd”不存在。

这是否意味着我应该将char数组的某些索引设置为该散列值?如果是这样,我如何确定放置哪个索引?(对于位数组B,每个哈希函数的值都是B(h1(x))=1,B(h2(x))=1,但我不知道如何处理char数组)看起来char数组基本上是char的集合。现在,整个char数组是一个字符串。因此,您可以使用我提到的散列方法将整个内容转换为int。然后在该整数上进行bloom过滤@ZhiyuanRuan@ZhiyuanRuan.当前位置检查我的答案我刚看到你修改过的答案。我现在明白你的观点了,但我仍然不知道如何选择合适的位置来放置。“你能详细说明吗?”支元阮:我会试试……我会用C++。