我们有一个32位的C ++ / CLI程序集,其中一个类包装了一个本机对象。它重写GetHashCode以返回它包装的本机对象的地址(m_native是一个指针):
int NativeWrapper::GetHashCode()
{
return (int)m_native;
}
我现在正在将此程序集转换为支持64位,因此当前的GetHashCode实现不再适用。有没有合适的算法从64位地址生成哈希码?或者我错过了一个更容易的替代方案?
答案 0 :(得分:1)
我会使用与.Net框架相同的算法来生成hash code of an Int64:低32位与高32位进行异或。
int NativeWrapper::GetHashCode()
{
return ((int)m_native) ^ (int)(m_native >> 32);
}
虽然,你可以为简单截断做一个案例:这就是IntPtr.GetHashCode的作用。
如果你想支持双32/64编译,可能将m_native
转换为IntPtr
并使用其GetHashCode将是一个很好的实现,可以在32位和64位模式下工作。