我只是很好奇,因为我猜它会影响性能.它是否考虑完整的字符串?如果是,长字符串会很慢.如果它只考虑字符串的一部分,它将具有不良的性能(例如,如果它只考虑字符串的开头,如果HashSet主要包含具有相同的字符串,则它将具有不良性能.
我有以下两个字符串:
var string1 = "MHH2016-05-20MASTECH HOLDINGS, INC. Financialshttp://finance.yahoo.com/q/is?s=mhhEDGAR Online FinancialsHeadlines";
var string2 = "CVEO2016-06-22Civeo upgraded by Scotia Howard Weilhttp://finance.yahoo.com/q/ud?s=CVEOBriefing.comHeadlines";
Run Code Online (Sandbox Code Playgroud)
乍一看这两个字符串是不同的,但是它们的哈希码使用的是相同的GetHashCode method
.
var hash = 0;
var total = 0;
foreach (var x in string1) //string2
{
//hash = x * 7;
hash = x.GetHashCode();
Console.WriteLine("Char: " + x + " hash: " + hash + " hashed: " + (int) x);
total += hash;
}
Run Code Online (Sandbox Code Playgroud)
两个字符串的总计最终为620438779.还有另一种方法会返回更独特的哈希码吗?我需要基于字符串中的字符使哈希码唯一.虽然两个字符串都不同并且代码正常工作,但这两个字符串恰好相同.如何改进此代码以使其更加独特?
我刚刚了解到:
Dictionary<TKey,?TValue>
Class的链接MSDN文章.GetHashCode()
不为每个唯一字符串值提供唯一的散列码值.根据有关字符串类的相应MSDN文章,不同的字符串可以返回相同的哈希码.这让我想到,.NET中的字典(至少在使用字符串作为键时)容易受到键冲突的影响.
这种钥匙碰撞会发生什么?是否存在任何已知的唯一字符串值,实际发生碰撞?字典是否会在这些关键值上被打破?
另外:
注意:我不是指特定的.NET CLR,但如果重要,那么让我们来谈谈桌面的4.5.2 32位版本.
关于重复的说明: