GetHashCode - 从 64 位地址生成哈希码
GetHashCode - Generate hash code from 64-bit address
我们有一个 32 位 C++/CLI 程序集,其中一个 类 包装了一个本机对象。它将 GetHashCode 覆盖为 return 它包装的本机对象的地址(m_native 是一个指针):
int NativeWrapper::GetHashCode()
{
return (int)m_native;
}
我现在正在转换此程序集以支持 64 位,因此当前的 GetHashCode 实现不再适用。是否有任何合适的算法从 64 位地址生成哈希码?还是我缺少更简单的选择?
我将使用与 .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 位模式下都能工作的很好的实现。
我们有一个 32 位 C++/CLI 程序集,其中一个 类 包装了一个本机对象。它将 GetHashCode 覆盖为 return 它包装的本机对象的地址(m_native 是一个指针):
int NativeWrapper::GetHashCode()
{
return (int)m_native;
}
我现在正在转换此程序集以支持 64 位,因此当前的 GetHashCode 实现不再适用。是否有任何合适的算法从 64 位地址生成哈希码?还是我缺少更简单的选择?
我将使用与 .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 位模式下都能工作的很好的实现。