所述boost::hash_combine模板函数采用一个散列(称为参考seed)和对象v.根据文档,它结合seed了vby 的哈希
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Run Code Online (Sandbox Code Playgroud)
我可以看出这是确定性的.我明白为什么要使用XOR.
我敢打赌,这个加法有助于将相似的值广泛分开,因此探测哈希表不会崩溃,但有人可以解释这个神奇常数是什么吗?
C++ 0x添加hash<...>(...).
我找不到一个hash_combine函数,如boost中所示.实现这样的事最简洁的方法是什么?也许,使用C++ 0x xor_combine?
我正在研究一个需要操纵巨大矩阵的项目,特别是用于copula计算的金字塔总和.
简而言之,我需要在矩阵(多维数组)中的零海中跟踪相对较少数量的值(通常值为1,在极少数情况下大于1).
稀疏数组允许用户存储少量值,并假设所有未定义的记录都是预设值.由于实际上不可能将所有值存储在内存中,因此我只需要存储少数非零元素.这可能是数百万条目.
速度是一个重中之重,我还想在运行时动态选择类中的变量数.
我目前正在使用二进制搜索树(b-tree)来存储条目的系统.有谁知道更好的系统?
我有一些整数向量,我想在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;
}
};
Run Code Online (Sandbox Code Playgroud)
然后将对象存储在unordered_mapI中然而有几个问题
==和哈希函数的包装器对象来记忆哈希并避免多次计算?在进行性能分析时,我注意到我的cpu时间相当大,花费在无序地图上进行查找,这不是最佳的:(
目前Boost具有hash_combine函数,该函数输出32位无符号整数(确切地说,size_t).一些参考:
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/combine.html
我想探讨如何创建64位版本的hash_combine.
第一件事是获得64位的黄金比例或任何其他无理数.
第二部分是使用轮班.这部分相当棘手,我想询问是否有最佳实践或指导使用转移来获取哈希值?或者像原始代码一样选择班次:
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Run Code Online (Sandbox Code Playgroud)
是随机的?
另外如何评估输出hash_combine以确保它不会产生比原始哈希函数更多的冲突hash_value?
我面临着散列问题__uint128_t。以下是我的代码:
#include <iostream>\n\nint main () {\n __uint128_t var = 1;\n std::cout << std::hash<__uint128_t> () (var) << "\\n";\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n我收到的错误如下:
\ntest.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:5:40: error: use of deleted function \xe2\x80\x98std::hash<__int128 unsigned>::hash()\xe2\x80\x99\n 5 | size_t h = std::hash<__uint128_t> () (var);\n | ^\nRun Code Online (Sandbox Code Playgroud)\n我如何获得 的哈希值__uint128_t?(可能是一个非常基本的问题,但我已经被困在这里一段时间了)。另外,我想知道这个错误的含义。提前致谢。
我有一个名为 Col 的结构:
struct Col
{
Object* o1;
Object* o2;
Object* o3;
bool operator==(const Col &other) const
{
return o1 == o1 && o2 == o2 && o3 == o3;
}
};
Run Code Online (Sandbox Code Playgroud)
我对此定义了一个哈希:
template <>
struct std::hash<Col>
{
std::size_t operator()(const Col& k) const
{
using std::size_t;
std::hash<void> void_hash;
std::size_t res = void_hash(k.o1) + void_hash(k.o2) + void_hash(k.o3;
return res;
}
};
Run Code Online (Sandbox Code Playgroud)
然后,我有很多包含重复项std::vector的Col对象(根据我对相等的定义),并且我希望仅“处理”每个唯一元素一次。
这就是我所做的:
std::unordered_map<Col, bool> done_list;
for (Col c : col_list)
{
if (done_list.find(c) == done_list.end())
{ …Run Code Online (Sandbox Code Playgroud)