两个值的std :: set <int>的快速哈希?</int>

时间:2010-09-02 19:15:58

标签: c++ stl hash map set

我使用std::set<int>作为标准地图的密钥(std::unordered_map<std::Set<int>,float>)。我需要这个集合的哈希值。

该集合将始终只有两个整数,其值可能高达200万。

关于性能等关键的良好和快速哈希的任何想法都很重要吗?

3 个答案:

答案 0 :(得分:4)

您可以使用boost :: hash_combine():http://www.boost.org/doc/libs/1_44_0/doc/html/hash/combine.html

答案 1 :(得分:3)

您没有准确说明查找的目的是什么, 但也许你应该(或不应该):

  • 只需使用struct {int a,b; }作为键 - 您可以控制成员的插入(确保a <= b

  • 使用Sparse Matrix实施

此致

RBO

答案 2 :(得分:2)

我放弃了设定的想法(在std::set中存储两个整数是浪费内存和时间)并与这对结合起来。然后定义

template <class A>
struct unordered_pair_hash
{
  std::size_t operator()(const std::pair<A, A>& p) const { 
    using std::min;
    using std::max;
    return std::hash<A>()(min(p.first, p.second))+
        17*std::hash<A>()(max(p.first, p.second));
  }
};

template <class A>
struct unordered_pair_eq
{
  bool operator()(const std::pair<A, A>& p1, const std::pair<A, A>& p2) const {
    using std::min;
    using std::max;
    return min(p1.first, p1.second)==min(p2.first, p2.second) &&
           max(p1.first, p1.second)==max(p2.first, p2.second);
  }
};

然后使用自定义哈希和相等声明地图。

std::unordered_map<std::pair<int, int>, float, unordered_pair_hash<int>, unordered_pair_eq<int> > ...