您可以使用一些散列算法将其转换为整数散列,然后将其每个位视为位数组或字符数组的一部分。
hash(S)=sum(S[i]*(p^i))_i=0 to n-1.
您可以使用此哈希 2 次来减少误报的机会。这会给你一个合理的行为。
p 的选择也必须限制为素数,并且它应该大于字母集中的字符数。
- 与简单的 ascii 值相加相比,这将为您提供更好的结果。
还有一个奇怪的地方是使用的哈希函数应该是独立且均匀分布的。
速度快也是标准加密哈希不是好的选择的另一个标准。 (如sha1)
我听说的一种标准哈希方法是murmurhash,您可以尝试使用它并与您期望的结果进行比较。
要明确你将如何实施它:-
您可以考虑多个哈希函数,例如 murmur、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
}
注意:我在这里提到了地图……它可以是一个位数组,也可以是你设置位的地方。例如..如果
stackoverflow 11,17 和第 45 位将设置为 1。
请注意,此地图将帮助您回答是否存在元素的查询。
现在在查询的情况下,您将执行相同的操作,获取哈希值并检查这些值是否存在。如果是,则很有可能存在(不完全是因为它可能是误报),如果不是,则不确定。
假设现在您将检查字符串“abcd”是否存在。您应用前面使用的 3 个哈希函数。结果是 11,99,55。您将检查它们是否都存在。您可以看到 55 不存在。所以字符串“abcd”不存在。