簡體   English   中英

.Net C#String.GetHashCode()替代方案

[英].Net C# String.GetHashCode() alternative

比較很多字符串數據(csv文件)時遇到問題。 這些文件具有唯一ID但未排序且非常大。

所以我嘗試創建兩個字典,其中key是來自file的uniqueID,而Value是int,它返回我感興趣的字符串的GetHashCode()以進行更改。

但是,簡短的例子:

if ("30000100153:135933:Wuchterlova:335:2:Praha:16000".GetHashCode() == 
    "30000263338:158364:Radošovická:1323:10:Praha:10000".GetHashCode())
{
    Console.WriteLine("Hmm that's strange");
}

那么有沒有其他方法可以做到這一點。

我需要盡可能少的footprit(由於兩個csv文件的兩個字典的內存分配,其中包含大約3M行)謝謝

首先,string.GetHashCode的文檔明確表示不要將字符串哈希碼用於需要隨時間穩定的任何應用程序,因為它們不是。 您應該僅將字符串哈希碼用於一個目的,即將字符串放入字典中。

其次,哈希碼不是唯一的。 只有40億個可能的哈希碼(因為哈希碼是32位整數)但顯然有超過40億個字符串,因此必須有許多具有相同哈希碼的字符串。 只有幾千個字符串的集合具有包含具有相同哈希碼的兩個字符串的極高概率。 概率圖在這里:

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

所以你可能想知道字典是如何工作的,如果它使用的是GetHashCode,但可能存在沖突。 答案是:當你把兩個東西X和Y放在一個具有相同哈希碼的字典中時,它們會進入同一個“桶”。 當您搜索X時,字典會使用哈希代碼轉到右側存儲桶,然后對存儲桶中的每個元素執行昂貴的相等檢查,直到找到正確的字符。 由於每個桶都很小,因此大多數情況下此檢查仍然足夠快。

我不知道如何解決你的問題,但使用32位哈希顯然不是正確的方法,所以嘗試其他的東西。 我的建議是,如果要管理大量數據,請開始使用數據庫而不是CSV文件。 這就是數據庫的用途。

我寫了很多關於字符串哈希的文章,你可能會感興趣:

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

http://blogs.msdn.com/b/ericlippert/archive/2011/07/12/what-c​​urious-property-does-this-string-have.aspx

http://blogs.msdn.com/b/ericlippert/archive/2005/10/24/do-not-use-string-hashes-for-security-purposes.aspx

http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/

您實際上並不想使用GetHashCode。 你應該直接比較字符串。 然而,在沒有首先對列表進行排序的情況下,在任何合理的時間內將每個3M字符串與另一個3M字符串進行比較將是困難的。

我的方法是首先對每個列表進行排序(如何做到這取決於許多事情),讀取從每個列表中排序的第一個 - 然后調用A和B,然后:

  1. 如果A = B然后做任何事情並閱讀下一個A和下一個B並重復
  2. 如果A <B做任何事情並閱讀下一個A並重復
  3. 如果A> B做任何事情並閱讀下一個B並重復

..在這種情況下,“做任何事”意味着做什么都需要做,重復意味着回到第1步。

(這個過程是大型機計算機用來合並卡片堆棧並具有特定名稱的過程,但我不能為我的生活記住它!)

干杯 -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM