我一直在阅读和学习哈希和哈希表,并与一些代码一起训练(我对这个还是很新的,所以我可能会说我错过了一些错误的东西)。我对这个问题提出了完美的散列函数。只要我有,不知怎的,具有完美的哈希函数我自己的自定义类型:完美的散列函数是否保证没有碰撞?
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
碰撞!我了解哈希和哈希表有什么问题吗?它表明完美的散列函数并不完美。
如果你可以写一个完美的散列函数,我想有一百万美元在等着你。 – ChiefTwoPencils 2013-05-11 20:41:23
@ C.Lang一个完美的散列函数在限制可散列数据集时很容易编写。 – 2013-05-11 20:54:03
@SethCarnegie:谢谢。我通过非限制性的实现了解到。根据他在朱利安的回答中的评论,这是OP所指的。无论如何,只是另一件事缠绕我的头:)\ – ChiefTwoPencils 2013-05-11 21:15:35