【发布时间】:2013-12-28 23:11:18
【问题描述】:
我有一些整数向量,我想在 c++11 的 unordered_map 中有效地存储我的问题是:
如何最好地存储这些并针对.find 查询进行优化?
我想出了以下哈希:
class uint32_vector_hasher {
public:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t ret = 0;
for(auto& i : vec) {
ret ^= std::hash<uint32_t>()(i);
}
return ret;
}
};
然后将对象存储在 unordered_map 中,不过我有几个问题
- 哈希的计算频率是多少,只有一个,一些随机数或次数?
- 使用
==和散列函数创建一个包装器对象以记住散列并避免重复计算是否有意义?
在进行分析时,我注意到我的大量 cpu 时间花在查找无序地图上,这并不是最佳的 :(
【问题讨论】:
-
每次插入和每次查找都会进行一次哈希处理,并且每次调整基础表的大小时都可能为每个对象再次处理一次。
-
澄清一下,系统不会散列表中已经存在的东西,只是因为您正在查找某些内容,而只是您用于查找的键。
-
顺便说一句,xor 是一个可怕的哈希组合器
-
一些示例扩展@RichardPlunkett 关于 xor 是一个糟糕的组合器的评论:如果两个向量具有相同的数据但顺序不同,它们将具有相同的哈希值。如果一个向量具有多个相同的值,则这些值中的大多数都不会影响组合散列(它们相互抵消)。如果值通常很小(或者更确切地说,不使用
uint32_t中的全部位),那么最高有效位将不会用于组合散列中。 -
@Martin,sort 不太可能有帮助,除非它意味着一个特别可怕的例子不会出现,还有很多其他例子。