【发布时间】:2016-06-17 11:32:21
【问题描述】:
我看了以下问题:
Good GetHashCode() override for List of Foo objects respecting the order
然后问乔恩·斯基特以下问题: Good GetHashCode() override for List of Foo objects respecting the order
"@JonSkeet 该解决方案是否与跨多个 AppDomains 的字符串列表产生一致的结果?我有一个 WCF 服务器,来自不同平台(XP、Vista、Win7 或不同的 .Net Frameworks 3.5 及更高版本)的多个应用程序可以连接,在所有这些情况下,我需要来自字符串列表的一致哈希码是这种情况吗?如果不是,我将如何实现?"
他的回答: “@RandRandom:您不应该为此使用 GetHashCode - 它并不意味着在不同的进程中保持一致。您应该为此使用 SHA-256 之类的东西。”
不确定他提出的答案的实施情况如何,所以为了不在 cmets 领域提出详细问题,我决定创建一个新问题。
所以假设你有以下列表:
var fooList = new List<string>()
{
"",
"StatAccount",
"Value",
"9900000701",
"P1",
"3",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"VFE-Lage.xlsx",
"",
"",
"False",
"",
"",
"",
"",
"",
"",
"",
"",
};
现在我需要一个比检查 SequenceEquality 更容易/更快比较的 hashCode,我的列表是不可变的,它永远不会改变。
我的课程看起来像这样:
public class Foo
{
private List<string> _fooList = new List<string>();
private int _fooListHashCode;
public List<string> FooList
{
get
{
return _fooList;
}
set
{
_fooList = value;
_fooListHashCode = GetListsHashCode(value);
}
}
public static int GetListsHashCode(List<string> list)
{
//return hashCode...
return 0;
}
public override int GetHashCode()
{
return _fooListHashCode;
}
public override bool Equals(object obj)
{
var foo = obj as Foo;
if (foo == null)
return false;
return this._fooListHashCode == foo._fooListHashCode;
}
}
【问题讨论】:
标签: c#