【发布时间】:2021-06-15 05:43:35
【问题描述】:
我有以下两个字符串:
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";
乍一看这两个字符串是不同的,但是它们的哈希码使用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;
}
两个字符串的总计最终为 620438779。是否有另一种方法可以返回更独特的哈希码?我需要哈希码根据字符串中的字符是唯一的。尽管两个字符串不同并且代码可以正常工作,但这两个字符串恰好加起来是相同的。如何改进此代码以使其更加独特?
【问题讨论】:
-
您确实意识到,不是吗,您不能保证所有可能的字符串都有唯一的哈希码?哈希码是 32 位,这意味着有 40 亿(和变化)可能的值。您的两个字符串中的每一个都超过 120 个字符。使用 96 个可打印 ASCII 字符的可能 120 个字符的字符串数量要多得多。碰撞是不可避免的。 一般情况下不存在唯一哈希码。使哈希码变大会减少碰撞的机会,但不会消除它。
-
您的问题暗示您正在尝试使用哈希码作为唯一标识符。这是一个非常糟糕的主意,注定要失败。 @AlexD 的回答解释了原因。
-
@JimMischel 是的,我现在知道了,但谢谢
-
老问题,我知道,看我3年前的问题和答案:stackoverflow.com/questions/15377161/…
标签: c#