我需要为unordered_map
专门设计哈希函数,以便我可以使用整数数组作为键。这些数组的值通常为0或1,例如int array = {0, 1, 0, 1}
,但技术上没有界限。
有人可以推荐在这种情况下适用的良好哈希函数吗?或者,我可以将整数数组转换成字符串并避免专门设计哈希函数。但我担心性能问题,因为我可能会有几百万个这样的数组。
C++ TR1 包含一个哈希模板函数。
如果你还没有,可以使用 Boost Hash。
一个实用的辅助功能想法:
#include <boost/functional/hash.hpp>
template <typename T, int N>
static std::size_t hasharray(const T (&arr)[N])
{
return boost::hash_range(arr, arr+N);
}
size_t seed = 0;
for (const T* it=arr; it!=(arr+N); ++it)
boost::hash_combine(seed, *it);
return seed;
std::size_t N
,因为 std::size_t
能够保证能够表示最大可能的数组大小,而 int
可能会溢出(取决于系统)。此外,它不需要是有符号类型。 - outofthecaveN<10
,则 N-10
将会被包装回来。惊喜!)。此外,静态类型大于 2³¹ 元素的数组?那些很少见。如果你拥有它们,你也不经常对它们进行哈希处理。 - sehe
hash_combine
构建的,该函数也在Boost中,并且应该真正成为标准。 - Kerrek SB