如何确保将int64 var赋值给int32 var包装(c ++ / c11)

时间:2015-05-30 13:16:07

标签: c++ hashtable integer-hashing

背景

我使用一个小的静态哈希表(线性探测),我需要在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;
}

0 个答案:

没有答案