【问题标题】:Bloom Filter char based基于 Bloom 过滤器的字符
【发布时间】:2017-10-31 16:34:47
【问题描述】:

我是布隆过滤器的新手。我了解如何使用位数组实现布隆过滤器,我们使用 k 个哈希函数对值 x 进行哈希处理,并将每个位数组索引设置为 1。

但我想知道我们将如何使用 char 数组实现布隆过滤器?特别是如果输入是字符串。我能想到的一种方法是添加字符串的每个 char 的 ASCII 值并散列该值,然后将 char 数组的索引设置为某个值(如果我使用这种方法,我也不确定在 char 数组中设置什么值,因为它可以'不只是 0 或 1,因为我们没有使用位数组),但误报的概率会非常高。有人可以给我一些想法来开始吗? (我不需要实际的代码,但如果你能给我一些关于使用什么哈希函数以及如何将它们映射到 char 数组的见解,我真的很感激)

【问题讨论】:

  • 我要使用C++

标签: algorithm hash bloom-filter


【解决方案1】:

您可以使用一些散列算法将其转换为整数散列,然后将其每个位视为位数组或字符数组的一部分。

hash(S)=sum(S[i]*(p^i))_i=0 to n-1.

您可以使用此哈希 2 次来减少误报的机会。这会给你一个合理的行为。

p 的选择也必须限制为素数,并且它应该大于字母集中的字符数。

  • 与简单的 ascii 值相加相比,这将为您提供更好的结果。

还有一个奇怪的地方是使用的哈希函数应该是独立且均匀分布的。

速度快也是标准加密哈希不是好的选择的另一个标准。 (如sha1)

我听说的一种标准哈希方法是murmurhash,您可以尝试使用它并与您期望的结果进行比较。

要明确你将如何实施它:-

您可以考虑多个哈希函数,例如 murmurfnv1a 或 即使是我提出的简单的,然后你会从每个值中得到 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
}

注意:我在这里提到了地图……它可以是一个位数组,也可以是你设置位的地方。例如..如果 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。然后对该整数进行布隆过滤。 @ZhiyuanRuan
  • @ZhiyuanRuan.:检查我的答案..我修改了
  • 我刚刚看到您修改后的答案。我现在明白了你的观点,但我仍然不确定如何选择合适的放置位置。你能详细说明一下吗?
  • @ZhiyuanRuan.: 我试试..等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多