我一直在閱讀和學習哈希和哈希表,並與一些代碼一起訓練(我對這個還是很新的,所以我可能會說我錯過了一些錯誤的東西)。我對這個問題提出了完美的散列函數。只要我有,不知怎的,具有完美的哈希函數我自己的自定義類型:完美的散列函數是否保證沒有碰撞?
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