2014-09-27 66 views
0

怎麼可能是二在C#中的哈希衝突?我知道對於一般的對象來說,兩個不平等的對象並不保證有不相等的哈希碼,但是當對象是字符串時它是如何表現的。在C#中的字符串哈希衝突

我特別需要從一個URL字符串的唯一鍵的功能,但不需要任何幻想,它只是緩存的東西從網絡,跳過下載如果某個網址已加載。

編輯

如果我這樣定義

string UniqueKey (string url) { 

    var list = SplitStringInHalf (url); 
    var firstHalf = list[0].GetHashCode(); 
    var secondHalf = list[1].GetHashCode(); 

    return firstHalf.ToString() + secondHalf.ToString(); 
} 
+0

這取決於對哈希算法。以低碰撞概率,如sha256。 – 2014-09-27 00:58:39

+1

@WiktorZychla,他沒有提到它,但我認爲他在談論GetHashCode()。 Cristian請指定您正在使用的哈希函數。 – BlueTrin 2014-09-27 00:59:31

+0

它尋找與C#無關的問題,因爲散列函數是算法構造,而不是語言特定的功能。它也是堆棧溢出的主題,因爲它不涉及編碼。考慮詢問http://programmers.stackexchange.com/或http://crypto.stackexchange.com/ – 2014-09-27 00:59:37

回答

0

對於GetHashCode()方法,你可以參考這個question堆棧溢出。它會告訴你,對於小絃線它顯然更高。一般來說,只要它是合理的,對於相對較長的字符串都是獨立的,但是在兩個字符串之間的機會相當低,但是由於你有很多字符串,概率的詛咒會使它更高(對於例如,當你爲一個組添加一個人時,組中兩個人有相同生日的機會要高得多)。

作爲一般規則,你不應該依賴它是唯一的,你可以用它來區分主鍵,但是你需要確保兩個具有相同哈希碼的字符串是不同的,如果你使用它整理它們。

例如,您可以使用哈希碼創建一個hash table,該鍵不會是唯一的,但只有在碰撞時纔可以進行適當的比較,從而簡化比較任務時您有大量的元素。