我有一组具有 3 级层次结构的数据。每个级别都有一个名称。
我正在考虑将所有这些名称组合成一个字符串,然后创建一个数字散列,该散列可用作服务结构有状态服务的散列键。
我在网上看到很多关于使用密钥查找数据的信息,但我不确定如何以有效的方式实际创建它们。
理想情况下,我想要一个在 SQL Server 2017 和 C# 中快速且易于生成的哈希。
谁能指出我正确的方向,好吗?
保罗
我有一组具有 3 级层次结构的数据。每个级别都有一个名称。
我正在考虑将所有这些名称组合成一个字符串,然后创建一个数字散列,该散列可用作服务结构有状态服务的散列键。
我在网上看到很多关于使用密钥查找数据的信息,但我不确定如何以有效的方式实际创建它们。
理想情况下,我想要一个在 SQL Server 2017 和 C# 中快速且易于生成的哈希。
谁能指出我正确的方向,好吗?
保罗
SF 团队的建议是为此使用 FNV-1 哈希算法。
选择散列算法 散列的一个重要部分是选择你的散列算法。一个考虑因素是目标是否是将相似的键彼此靠近(局部敏感散列) - 或者是否应该将活动广泛分布在所有分区(分布散列),这更常见。
一个好的分布散列算法的特点是计算容易、冲突少、密钥分布均匀。高效散列算法的一个很好的例子是 FNV-1 散列算法。
一般散列码算法选择的一个很好的资源是散列函数的维基百科页面。
此示例中的 AC# 实现在这里:
public long HashString(string input)
{
input = input.ToUpperInvariant();
var value = Encoding.UTF8.GetBytes(input);
ulong hash = 14695981039346656037;
unchecked
{
for (int i = 0; i < value.Length; ++i)
{
hash ^= value[i];
hash *= 1099511628211;
}
return (long)hash;
}
}
删除ToUpperInvariant以使其区分大小写。