.Net C#String.GetHashCode()替代方案
比较很多字符串数据(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-curious-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/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |