【发布时间】:2020-05-14 13:22:05
【问题描述】:
基本上我使用的是 rabin karp 中使用的哈希函数。
与Fast implementation of Rolling hash 中的函数相同,但我不是散列一个字符串,而是散列一个整数向量。
const unsigned PRIME_BASE = 257;
const unsigned PRIME_MOD = 1000000007;
unsigned hash(const std::vector< unsigned int >& Line)
{
unsigned long long ret = 0;
for (int i = 0; i < Line.size(); i++)
{
ret = ret*PRIME_BASE + Line[i];
ret %= PRIME_MOD;
}
return ret;
}
问题是我遇到了很多碰撞。更改素数可以最小化或最大化碰撞,但我无法避免。
任何想法如何避免与此类或更好的功能发生冲突?
【问题讨论】:
-
不可能避免与哈希的冲突。如果你没有冲突,那么你就没有散列函数。
-
目标是尽量减少冲突,而不是消除它们。除非您有比可能输入更多的可能哈希,否则您将始终存在争用,这在某种程度上违背了哈希的意义。
-
how to avoid collisions这是不可能的,您可以最大限度地减少特定数据集的冲突,但是对于另一个数据集,相同的哈希函数可能会失败 -
注意:在 C++ 中将其表示为
std::vector<x>而不是std::vector< x >并带有额外的间距。这最终看起来很奇怪,例如 shell 重定向 (>&) 或小于运算符。 -
你测量了平均碰撞率吗?