gpt4 book ai didi

c# - 跨进程/平台的字符串列表的一致哈希码

转载 作者:行者123 更新时间:2023-11-30 21:48:09 25 4
gpt4 key购买 nike

我看了下面的问题:

Good GetHashCode() override for List of Foo objects respecting the order

并向 Jon Skeet 提出以下问题: Good GetHashCode() override for List of Foo objects respecting the order

“@JonSkeet 该解决方案是否会在多个 AppDomain 中产生与字符串列表一致的结果?我有一个 WCF 服务器,来自不同平台(XP、Vista、Win7 或不同的 .Net Frameworks 3.5 及更高版本)的多个应用程序可以连接,在所有这些情况下,我需要从字符串列表中获得一致的哈希码,是这种情况吗?如果不是,我将如何实现?”

他的回答:“@RandRandom:您不应该为此使用 GetHashCode - 它并不意味着在不同进程之间保持一致。您应该为此使用 SHA-256 之类的东西。”

不确定他提出的答案的实现情况如何,所以为了不在评论区提出详细问题,我决定创建一个新问题。

假设您有以下列表:

var fooList = new List<string>()
{
"",
"StatAccount",
"Value",
"9900000701",
"P1",
"3",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"VFE-Lage.xlsx",
"",
"",
"False",
"",
"",
"",
"",
"",
"",
"",
"",
};

现在我需要一个 hashCode,它比检查 SequenceEquality 更容易/更快地进行比较,我的列表是不可变的,它永远不会改变。

我有一个看起来像这样的类:

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;
}
}

最佳答案

这应该适用于使用 SHA256 哈希比较两个字符串列表。

    private bool CompareLists(IEnumerable<string> value1, IEnumerable<string> value2)
{
// First convert lists to single strings
var encoder = new UTF8Encoding();
var hash = new SHA256CryptoServiceProvider();
var sb1 = new StringBuilder();
var sb2 = new StringBuilder();

foreach (var item in value1)
{
sb1.Append(item);
}

foreach (var item in value2)
{
sb2.Append(item);
}

// Then hash and compare
return Convert.ToBase64String(hash.ComputeHash(encoder.GetBytes(sb1.ToString()))) ==
Convert.ToBase64String(hash.ComputeHash(encoder.GetBytes(sb2.ToString())));
}

由于您的主列表是不可变的,您可能应该为它计算一次哈希并存储它,这将使该方法的性能更高一些。可能有更好的方法,但这应该可行。

注意:要使此方法返回 true,两个列表必须完全相同;相同数量的字符串,相同的字符串(包括大小写),相同的顺序。

关于c# - 跨进程/平台的字符串列表的一致哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37880511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com