背景
我使用一个小的静态哈希表(线性探测),我需要在OpenGL渲染管道的一个阶段,我必须尽快检索和更新int64_t类型的键和一些数据。简而言之,这个阶段是将大型ID转换为后续阶段使用的小型本地索引(因此,在此阶段,我需要一次处理64位密钥,并且不能使用32位密钥)。
我长期以来一直试图找到一种能够在32位和64位手臂架构(iOS和Android智能手机)上快速运行的哈希函数。当然,在32位设备上,64位密钥的散列比散列32位密钥慢得多(在我的测试用例中几乎是10次)。
我现在对我在SO上找到的哈希非常有信心,在我的情况下它优于MurmurHash3 32位终结器(有更多的碰撞,但在我的情况下并不重要): https://stackoverflow.com/a/12996028/1708349
现在一切正常,但是这里有一个问题:我在对其进行哈希处理之前,天真地将64位密钥分配给int32_t类型 - 这是出于32位平台的性能原因而完成的。这似乎工作,大数据被包裹。但抓住当然是没有定义这种行为。
所以,我的问题是:将int64_t类型分配给int32_t类型的最佳(例如定义的编译器行为)是什么,所以它包装 - 并且例如不仅仅分配了低32位的64位int?
这是我的实际哈希函数:
inline int32_t hash2(int64_t k) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wconversion"
int32_t x = k;
#pragma clang diagnostic pop
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x);
return x;
}