我一直在阅读和学习散列和散列表,并使用了一些代码(我对此仍然很陌生,所以我可能会说一些我误解的错误)。我遇到了完美哈希函数的问题。假设我有自己的自定义类型,它以某种方式具有完美的哈希函数:
class Foo
{
private int data;
override int GetHashCode()
{
return data.GetHashCode();
}
}
Anint
的哈希码就是它int
本身,所以我有一个完美的哈希函数,对吧?但是当我们使用哈希函数通过简单的公式将对象映射到哈希表时:
index = foo.GetHashCode() % hashtable.Length
我们得到一个变量索引,它也取决于我们在哈希表中有多少元素。如果哈希表的大小仅为 int.MaxValue,那么我们将拥有一个完美的哈希函数。例如,假设我们有一个大小为 2 的哈希表。如果我们对数字 1 和 3 进行哈希处理,我们得到
1 % 2 = 1
3 % 2 = 1
碰撞!我对哈希和哈希表有什么误解吗?结果表明,完美的哈希函数并不完美。