$\newcommand{\O}{\mathrm{O}}$
ハッシュ関数のリスト.
pair_hash, vector_hash は boost ライブラリを参考にハッシュ値を combine して実装した.
あとの $4$ つは murmur hash と呼ばれるハッシュ関数で こちら で著者が公開しているコードを基に実装した.
なお murmur hash は基本 public domain(ノンライセンス) だが, ビジネス目的で用いる場合は MIT license であるとの文言があるので注意.
// pair に対する std::hash を用いたハッシュ関数 struct pair_hash { template <class C1, class C2> unsigned int operator() (const pair<C1, C2>& p) const { unsigned int lhs = hash<C1>()(p.first), rhs = hash<C2>()(p.second); return lhs^(rhs+0x9e3779b9+(lhs<<6)+(lhs>>2)); } }; // vector に対する std::hash を用いたハッシュ関数 struct vector_hash { template <class C> unsigned int operator()(const vector<C>& p) const { unsigned int h = p.size(); for(const C& k : p){ h ^= hash<C>()(k)+0x9e3779b9+(h<<6)+(h>>2); } return h; } }; // int に対する murmur hash struct murmur_hash_int32 { unsigned int operator()(int p) const { const unsigned int m = 0x5bd1e995; p *= m; unsigned int h = (p^(p>>24))*m; return h = (h^(h>>13))*m, (h^(h>>15)); } }; // long long に対する murmur hash struct murmur_hash_int64 { unsigned long long operator()(long long p) const { const unsigned long long m = 0xc6a4a7935bd1e995; p *= m; unsigned long long h = (p^(p>>47))*m; return h = (h^(h>>47))*m, (h^(h>>47)); } }; // vector<int> に対する murmur hash struct murmur_hash32 { unsigned int operator()(const vector<int>& p) const { const unsigned int m = 0x5bd1e995; unsigned int h = p.size(); for(unsigned int k : p){ k *= m, h = (h*m)^((k^(k>>24))*m); } h = (h^(h>>13))*m; return (h^(h>>15)); } }; // vector<long long> に対する murmur hash struct murmur_hash64 { unsigned long long operator()(const vector<long long>& p) const { const unsigned long long m = 0xc6a4a7935bd1e995; unsigned long long h = p.size(); for(unsigned long long k : p){ k *= m, h = (h*m)^((k^(k>>47))*m); } h = (h^(h>>47))*m; return (h^(h>>47)); } };