gpt4 book ai didi

c# - 是否可以结合私有(private)成员的哈希码生成新的哈希码?

转载 作者:IT王子 更新时间:2023-10-29 04:52:12 27 4
gpt4 key购买 nike

我有一个对象,我想为其生成一个唯一的哈希值(覆盖 GetHashCode()),但我想避免溢出或一些不可预测的事情。

该代码应该是组合一小部分字符串的哈希码的结果。

散列码将成为生成缓存键的一部分,因此理想情况下它们应该是唯一的,但是被散列的可能值的数量很少,所以我认为这里的概率对我有利。

这样的事情就足够了吗?有更好的方法吗?

int hash = 0;
foreach(string item in collection){
hash += (item.GetHashCode() / collection.Count)
}
return hash;

编辑:感谢您到目前为止的回答。@Jon Skeet:不,顺序不重要

我想这几乎是另一个问题,但由于我使用结果生成缓存键(字符串),使用像 MD5 这样的加密哈希函数或只使用此 int 的字符串表示是否有意义?

最佳答案

Marc 和 Jon 指出的基本原理并不差,但就结果分布的均匀性而言,它们远非最佳。可悲的是,很多人从 Knuth 那里复制的“乘以素数”方法是 not the best choice in many cases更好的分布可以通过更便宜的计算函数来实现(尽管这在现代硬件上非常微不足道)。事实上,将素数放入散列的许多方面是 no panacea .

如果此数据用于非常大的哈希表,我建议阅读 Bret Mulvey's excellent study and explanation of various modern (and not so modern) hashing techniques使用 C# 轻松完成。

请注意,各种哈希函数的字符串的行为严重偏向于字符串是短的(粗略地说,在位开始溢出之前对多少字符进行了哈希处理)还是长的。

Jenkins One at a time hash 是最简单和最容易实现的也是最好的之一。

private static unsafe void Hash(byte* d, int len, ref uint h)
{
for (int i = 0; i < len; i++)
{
h += d[i];
h += (h << 10);
h ^= (h >> 6);
}
}

public unsafe static void Hash(ref uint h, string s)
{
fixed (char* c = s)
{
byte* b = (byte*)(void*)c;
Hash(b, s.Length * 2, ref h);
}
}

public unsafe static int Avalanche(uint h)
{
h += (h<< 3);
h ^= (h>> 11);
h += (h<< 15);
return *((int*)(void*)&h);
}

然后你可以像这样使用它:

uint h = 0;
foreach(string item in collection)
{
Hash(ref h, item);
}
return Avalanche(h);

你可以像这样合并多个不同的类型:

public unsafe static void Hash(ref uint h, int data)
{
byte* d = (byte*)(void*)&data;
AddToHash(d, sizeof(int), ref h);
}

public unsafe static void Hash(ref uint h, long data)
{
byte* d= (byte*)(void*)&data;
Hash(d, sizeof(long), ref h);
}

如果您只能将字段作为对象访问而不知道内部结构,您可以简单地对每个字段调用 GetHashCode() 并像这样组合该值:

uint h = 0;
foreach(var item in collection)
{
Hash(ref h, item.GetHashCode());
}
return Avalanche(h);

遗憾的是你不能做 sizeof(T) 所以你必须单独做每个结构。

如果你想使用反射,你可以在每个类型的基础上构造一个函数,它对所有字段进行结构标识和散列。

如果您希望避免不安全的代码,那么您可以使用位掩码技术从 int 中提取单个位(如果处理字符串,则从 char 中提取单个位,而不会带来太多额外的麻烦。

关于c# - 是否可以结合私有(private)成员的哈希码生成新的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079192/

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