Естественный способ хэширования пары состоит в том, чтобы каким-то образом объединить хэши ее компонентов. Самый простой способ - просто с помощью xor:
namespace std {
namespace tr1 {
template<typename a, typename b>
struct hash< std::pair<a, b> > {
private:
const hash<a> ah;
const hash<b> bh;
public:
hash() : ah(), bh() {}
size_t operator()(const std::pair<a, b> &p) const {
return ah(p.first) ^ bh(p.second);
}
};
}} // namespaces
Обратите внимание, что это хэширует пары, такие как (1,1) или (2,2), все в ноль, поэтому вы можете использовать более сложный способ объединения хэшей частей, в зависимости от ваших данных. Boost делает что-то вроде этого:
size_t seed = ah(p.first);
return bh(p.second) + 0x9e3779b9 + (seed<<6) + (seed>>2);