【发布时间】:2013-05-11 20:40:18
【问题描述】:
我一直在阅读和学习散列和散列表,并使用了一些代码(我对此还是很陌生,所以我可能会说一些我误解的错误)。我遇到了完美哈希函数的问题。前提是我有自己的自定义类型,它以某种方式具有完美的哈希函数:
class Foo
{
private int data;
override int GetHashCode()
{
return data.GetHashCode();
}
}
int 的哈希码是 int 本身,所以我有一个完美的哈希函数,对吧?但是当我们使用哈希函数通过简单的公式将对象映射到哈希表时:
index = foo.GetHashCode() % hashtable.Length
我们得到一个变量索引,它也取决于我们在哈希表中有多少元素。如果哈希表的大小仅为 int.MaxValue,那么我们将拥有一个完美的哈希函数。例如,假设我们有一个大小为 2 的哈希表。如果我们对数字 1 和 3 进行哈希处理,我们会得到
1 % 2 = 1
3 % 2 = 1
碰撞!我对哈希和哈希表有什么误解吗?结果证明一个完美的哈希函数并不完美。
【问题讨论】:
-
如果你能写出完美的哈希函数,我想有一百万美元在等着你。
-
@C.Lang 一个完美的散列函数在限制可散列数据集时很容易编写。
-
@SethCarnegie:谢谢。我通过不受限制的实现来学习。根据他在朱利安的回答中的 cmets,这就是 OP 所指的。无论如何,只是另一件事让我头疼:)\
标签: c# hash hashtable perfect-hash