gpt4 book ai didi

c# - 哈希码 varbinary(20) c#

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:31 25 4
gpt4 key购买 nike

我有这门课:

public class SomeClass
{
public string Str1 { get; set; }
public string Str2 { get; set; }
public string Str3 { get; set; }
public string Str4 { get; set; }
}

我想创建一个哈希键,它作为 varbinary(20) 保存在数据库中,以确定类的唯一性(不区分大小写)。我想在这种情况下不能使用通常的 GetHashCode 方法。在这种情况下,最佳做法是什么?

最佳答案

简单的例子:

public class SomeClass
{
public string Str1 { get; set; }
public string Str2 { get; set; }
public string Str3 { get; set; }
public string Str4 { get; set; }

public byte[] SHA256()
{
using (var sha256 = new SHA256Managed())
{
var strings = new[] { Str1, Str2, Str3, Str4 };

for (int i = 0; i < strings.Length; i++)
{
string str = strings[i];

if (str != null)
{
// Commented lines are for using ToUpperInvariant()
//str = str.ToUpperInvariant()
byte[] length2 = BitConverter.GetBytes(str.Length);
sha256.TransformBlock(length2, 0, length2.Length, length2, 0);

// byte[] sortKeyBytes = Encoding.UTF8.GetBytes(str);
byte[] sortKeyBytes = CultureInfo.InvariantCulture.CompareInfo.GetSortKey(str, CompareOptions.IgnoreCase).KeyData;

sha256.TransformBlock(sortKeyBytes, 0, sortKeyBytes.Length, sortKeyBytes, 0);
}
else
{
byte[] length2 = BitConverter.GetBytes(-1);
sha256.TransformBlock(length2, 0, length2.Length, length2, 0);
}
}

sha256.TransformFinalBlock(new byte[0], 0, 0);

byte[] hash = sha256.Hash;
return hash;
}
}
}

我正在使用 SHA256,解决方案基于 @usr 在 https://stackoverflow.com/a/10452967/613130 中建议的解决方案.生成的哈希码长 32 个字节,但您可以将其截断为 20 个字节(显然您会降低其唯一性)。

我将各种字符串的长度添加到字符串中。这样 { "ABCD", "", "", ""} 将产生与 { "A", "B", "C", "D"} 不同的散列

如果你愿意,你可以使用旧的 ToUpperInvariant() 和基于它的散列(代码中有一些注释行......你取消注释它们,删除 byte[] sortKeyBytes = CultureInfo.InvariantCulture 并快乐地生活 :-))。

老实说,我不确定 GetSortKey 的“稳定性”... GetSortKey 会在 5 中返回相同的权重年,在 .NET 10.0 和 Unicode 11.0 中?谁知道?我当然不会!

MSDN建议他们可以改变:

If an application serializes a SortKey object, the application must regenerate all the sort keys when there is a new version of the .NET Framework.

所以最后我建议基于 .ToUpperInvariant() 的替代解决方案(要清楚,如果我的老板要求我这样做,我会告诉他:使用 .ToUpperInvariant ())。请注意,即使使用 .ToUpperInvariant(),将来也可能会有小的变化。可以为现有的小写字符引入新的大写字符。参见 http://unicode.org/faq/casemap_charprop.html “如果一对案例已经编码,是否可以添加案例对?”

关于c# - 哈希码 varbinary(20) c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061627/

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