【发布时间】:2015-09-14 21:37:46
【问题描述】:
根据标准,std::hash 类中不支持容器(更不用说无序容器了)。所以我想知道如何实现它。我有的是:
std::unordered_map<std::wstring, std::wstring> _properties;
std::wstring _class;
我考虑过迭代条目,计算键和值的单独哈希(通过std::hash<std::wstring>)并以某种方式连接结果。
有什么好的方法可以做到这一点,如果未定义地图中的顺序是否重要?
注意:我不想使用 boost。
建议了一个简单的异或,所以应该是这样的:
size_t MyClass::GetHashCode()
{
std::hash<std::wstring> stringHash;
size_t mapHash = 0;
for (auto property : _properties)
mapHash ^= stringHash(property.first) ^ stringHash(property.second);
return ((_class.empty() ? 0 : stringHash(_class)) * 397) ^ mapHash;
}
?
我真的不确定这个简单的异或是否足够。
【问题讨论】:
-
s/concatenate/XOR你应该很高兴。那么散列函数必须能够做的事情就是为两个语义等价的值生成相同的散列,并将其输出合理地均匀分布在所有可能的散列值集合中。 -
@dyp OP 想要对容器本身进行哈希处理。
-
基本上,您的问题是如何获取(无序)值范围的哈希值,实际上并不特定于
std::unordered_map? -
“够了”是什么意思?你如何定义“足够”?完全没有碰撞?
-
嗯,“足够”在这里意味着它满足与为 std::hash 定义的哈希函数相同的条件:en.cppreference.com/w/cpp/utility/hash。
标签: c++ c++11 hash unordered-map