我有一些整数向量,我想在c ++ 11中的unordered_map中有效存储我的问题是:
如何最好地存储这些内容并针对.find
查询进行优化?
我想出了以下的哈希:
class uint32_vector_hasher {
public:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t ret = 0;
for(auto& i : vec) {
ret ^= std::hash<uint32_t>()(i);
}
return ret;
}
};
然后将对象存储在unordered_map
我有几个问题
==
和哈希函数的包装器对象是否有意义来记住哈希并避免多次计算?在进行性能分析时,我注意到我的cpu时间相当大,花在无序地图上进行查找,这不是最佳选择:(
答案 0 :(得分:23)
因此,当不想使用boost时,Michael Blurr的评论导致了以下哈希函数的实现:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t seed = vec.size();
for(auto& i : vec) {
seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}
似乎工作。
答案 1 :(得分:17)