討論:
たとえば、キーとして使用したい任意の数の属性を持つstruct
/があるとします。class
std::unordered_map
struct Foo {
int i;
double d;
char c;
bool b;
};
ハッシュファンクターを定義する必要があることはわかっています。たとえば、次のようになります。
struct FooHasher {
std::size_t operator()(Foo const &foo) const;
};
そして、 mystd::unordered_map
を次のように定義します。
std::unordered_map<Foo, MyValueType, FooHasher> myMap;
しかし、私を悩ませているのは、 の呼び出し演算子を定義する方法ですFooHasher
。私も好む傾向があるそれを行う1つの方法は、を使用することstd::hash
です。ただし、多数のバリエーションがあります。たとえば、次のとおりです。
std::size_t operator()(Foo const &foo) const {
return std::hash<int>()(foo.i) ^
std::hash<double>()(foo.d) ^
std::hash<char>()(foo.c) ^
std::hash<bool>()(foo.b);
}
次のスキームも見ました。
std::size_t operator()(Foo const &foo) const {
return std::hash<int>()(foo.i) ^
(std::hash<double>()(foo.d) << 1) ^
(std::hash<char>()(foo.c) >> 1) ^
(std::hash<bool>()(foo.b) << 1);
}
黄金比を追加する人もいます。
std::size_t operator()(Foo const &foo) const {
return (std::hash<int>()(foo.i) + 0x9e3779b9) ^
(std::hash<double>()(foo.d) + 0x9e3779b9) ^
(std::hash<char>()(foo.c) + 0x9e3779b9) ^
(std::hash<bool>()(foo.b) + 0x9e3779b9);
}
質問:
- の結果に黄金比を追加したり、ビットをシフトしたりすることで、彼らは何を達成しようとしていますか
std::hash
。 - 基本型の任意の数の属性を持つオブジェクトに対する「公式スキーム」はありますか?
std::hash