2012-10-26 44 views
3

可能重複:
what is hashCode use for? is it unique?可以2個不同的字符串在C#中具有相同的哈希碼嗎?

我產生了很多的字符串,那麼我的問題是:

可以在2個不同的字符串在C#相同的散列碼?

通過哈希碼我的意思是:

string s = "Hello"; 
s.GetHashCode(); 

我的問題是更多關於C#遵循geneate琴絃的算法,也許 碰撞來時,已經或可能不會產生其他所有的哈希碼。 有人可能有這個答案。

+1

......是的...... –

+1

一切都可以有相同的散列碼,因爲它們是有限的。 –

+0

是的,這就是爲什麼像對象的字符串,它可以有更多的組合比潛在的散列數,一旦你找到兩個對象具有相同的散列,你必須以舊的標準方式比較它們,以確保它們是不會碰撞。 – LightStriker

回答

19

是的。散列碼不是唯一的。有2^32(4,294,967,296)可能的散列碼(32位整數中的每個整數值)。實際上有無數的可能的字符串。顯然,無限數量的字符串中的每一個都不可能有不同數量的有限數字。

具有相同散列碼的兩個不同字符串(或任何值)被稱爲「衝突」。一個好的散列算法將盡力確保最大限度地減少衝突(儘管它們不能被消除)。通常這將取決於實際數據的實際類型;在這種情況下,這意味着相似或相似大小的字符串應該(理想情況下)不易碰撞。

我假定你問的是因爲你正在考慮使用字符串的散列碼作爲字符串的唯一標識符。 Don't do that

Here是一個鏈接,通常會更詳細地討論哈希碼,如果您有興趣的話。

+0

只有2^2^30字符串左右:P – CodesInChaos

+0

@CodesInChaos現在快樂嗎? – Servy

+0

我挑戰你的斷言,說有無數可能的字符串。 –

0

簡單的答案是「是」。使用散列碼您總是有碰撞的機會。

5

一般來說,你應該期待一個哈希衝突,一旦你有儘可能多的元素作爲哈希空間http://en.wikipedia.org/wiki/Birthday_problem

的大小對於32位散列的平方根,你應該會圍繞65000元的第一次碰撞。 這當然是統計學的,所以你不能準確預測什麼時候會發生,但它對直覺有用。如果你有10個字符串,你可能不需要擔心碰撞,如果你肯定有100k的話。

+0

或者是不吉利,並且將它組合得少得多。這都是關於運氣。 – LightStriker

+0

概率並不重要。 Pigeonhole原則允許更好的論證。 – delnan

+0

@delnan概率問題。例如,一個加密的256位散列存在衝突,但是您可以依靠這種事情永遠不會發生的事實來編寫軟件。 – CodesInChaos

1

它取決於散列函數以及它正在使用的算法。一般來說,一些哈希技術可以將一個輸入(您想要哈希的值)映射到一個輸出(散列值),而另一些可以將兩個不同的輸入映射到同一輸出,後者稱爲碰撞http://en.wikipedia.org/wiki/Collision_(computer_science)

例如,如果一個哈希函數將100個用戶的名字編碼爲0-9,我們會碰到很多碰撞。

回到GetHashCode();

參考這兩篇文章在MSDN:

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

這一個解釋的功能,這裏是它的底部報價,查詢的第一發子彈:

GetHashCode被設計爲只做一件事:平衡散列表。不要用它來做其他事情。特別是:

  • 它不提供用於對象的唯一密鑰;碰撞概率非常高。
  • 它不具有加密強度,因此不要將其用作數字簽名或等同密碼的一部分
  • 它不一定具有校驗和所需的錯誤檢測屬性。

這裏有更多的解釋:

http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx

相關問題