use*_*765 1 c# hash 32bit-64bit
我注意到,当我为x86或x64构建时,我从其他对象获得的哈希码是不同的.到目前为止,我已经实现了大部分自己的哈希函数,如下所示:
int someIntValueA;
int someIntValueB;
const int SHORT_MASK = 0xFFFF;
public override int GetHashCode()
{
return (someIntValueA & SHORT_MASK) + ((someIntValueB & SHORT_MASK) << 16);
}
Run Code Online (Sandbox Code Playgroud)
将这些值存储得很长并从中获取哈希码会让我在64位系统上有更广泛的范围,或者这是一个坏主意?
public override int GetHashCode()
{
long maybeBiggerSpectrumPossible = someIntValueA + (someIntValueB << 32);
return maybeBiggerSpectrumPossible.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
不,那会更糟糕.
假设您的int值通常在short的范围内:介于-30000和+30000之间.并且进一步假设他们中的大多数都在中间附近,比如0到1000之间.这很典型.使用您的第一个哈希码,您可以将两个int中的所有位都写入哈希码,并且它们不会相互干扰; 在典型条件下,碰撞次数为零.
但是当你用很长的时间做你的技巧时,你就会依赖于GetHashCode的长实现,即低32位的高32位.所以你的新实现只是一种缓慢的写作方式int1 ^ int2.在典型情况下,几乎所有零比特都是如此,因此在整个地方都会发生冲突.
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |