向量的良好散列函数

时间:2013-12-11 05:39:16

标签: c++ c++11 hash

我有一些整数向量,我想在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我有几个问题

  1. 哈希计算的频率,只有一个,一些随机数或一次?
  2. 创建一个包含==和哈希函数的包装器对象是否有意义来记住哈希并避免多次计算?
  3. 在进行性能分析时,我注意到我的cpu时间相当大,花在无序地图上进行查找,这不是最佳选择:(

2 个答案:

答案 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)