我正在使用std::set<int>
作爲std映射的鍵(std::unordered_map<std::Set<int>,float>
)。我需要這個集合的散列。快速哈希爲std :: set <int>的兩個值?
設定將永遠只有兩個整數,其值可高達200萬。
如性能是至關重要的這樣一個關鍵的又好又快哈希任何想法?
我正在使用std::set<int>
作爲std映射的鍵(std::unordered_map<std::Set<int>,float>
)。我需要這個集合的散列。快速哈希爲std :: set <int>的兩個值?
設定將永遠只有兩個整數,其值可高達200萬。
如性能是至關重要的這樣一個關鍵的又好又快哈希任何想法?
我會溝組的想法(這是內存和時間存儲在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> > ...
爲什麼17作爲第二個值的倍數? – zenna 2010-09-03 15:57:29
你可以使用boost :: hash_combine():http://www.boost.org/doc/libs/1_44_0/doc/html/hash/combine.html
我是否理解正確嗎?你使用'std :: set'作爲'TR1:unordered_map'的關鍵嗎? – wheaties 2010-09-02 19:19:33
這是正確的 – zenna 2010-09-02 19:20:23
如果只有兩個整數,你爲什麼不使用'標準::對'爲你的鑰匙? –
2010-09-02 19:21:25