寻找关于我是否应该使用整数键作为哈希值本身,或将其转换为不同值的指导,我在这个问题上遇到了以下建议:
答案建议使用乘数来转换积分输入值
通常,您应该选择一个与哈希大小顺序相乘的乘数,并且没有与它相关的公因子。这样,哈希函数统一覆盖了所有哈希空间。
和
我发现以下算法提供了非常好的统计分布。每个输入位影响每个输出位的概率约为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;
}