讨论:
假设我有一个struct
/class
具有任意数量的属性,我想将其用作 a 的键,std::unordered_map
例如:
struct Foo {
int i;
double d;
char c;
bool b;
};
我知道我必须为它定义一个哈希函子,例如:
struct FooHasher {
std::size_t operator()(Foo const &foo) const;
};
然后将 my 定义std::unordered_map
为:
std::unordered_map<Foo, MyValueType, FooHasher> myMap;
不过,困扰我的是如何为FooHasher
. 我也倾向于喜欢的一种方法是使用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