我应该为无序容器散列整数键吗?

时间:2017-07-13 15:23:18

标签: c++ hash unordered-map unordered-set

寻找关于我是否应该使用整数键作为哈希值本身,或将其转换为不同值的指导,我在这个问题上遇到了以下建议:

答案建议使用乘数来转换积分输入值

  

通常,您应该选择一个与哈希大小顺序相乘的乘数,并且没有与它相关的公因子。这样,哈希函数统一覆盖了所有哈希空间。

  

我发现以下算法提供了非常好的统计分布。每个输入位影响每个输出位的概率约为50%。

然而,我接着又遇到了另一个问题

答案是指GCC实现,说明整数的默认std::hash只返回位模式

  

对于GCC中的实现,内置类型的专门化只返回位模式。以下是bits/functional_hash.h

中定义它们的方式
size_t
operator()(_Tp __val) const noexcept
{ return static_cast<size_t>(__val); }

我查看了我的版本(gcc-5.4.1),可以确认是这种情况。

所以我的问题是:

对于std::int64_t类型的整数键,我应该使用标准库提供的实现,还是应该使用替代方法,例如第一个链接中Thomas Mueller建议的函数以上?

uint64_t hash(uint64_t x) {
    x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
    x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
    x = x ^ (x >> 31);
    return x;
}

0 个答案:

没有答案