我只是注意到我从对象获取不同的哈希码,这取决于我是否为x86或64构建.我可以这样做吗?

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)

Eri*_*ert 7

不,那会更糟糕.

假设您的int值通常在short的范围内:介于-30000和+30000之间.并且进一步假设他们中的大多数都在中间附近,比如0到1000之间.这很典型.使用您的第一个哈希码,您可以将两个int中的所有位都写入哈希码,并且它们不会相互干扰; 在典型条件下,碰撞次数为零.

但是当你用很长的时间做你的技巧时,你就会依赖于GetHashCode的长实现,即低32位的高32位.所以你的新实现只是一种缓慢的写作方式int1 ^ int2.在典型情况下,几乎所有零比特都是如此,因此在整个地方都会发生冲突.