我使用std::set<int>
作为标准地图的密钥(std::unordered_map<std::Set<int>,float>
)。我需要这个集合的哈希值。
该集合将始终只有两个整数,其值可能高达200万。
关于性能等关键的良好和快速哈希的任何想法都很重要吗?
答案 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> > ...