在std :: hash的第三个模板参数std :: unordered_map或std :: unordered_set中使用std :: hash的一个很好的专长是为所有成员数据类型已经具有很好的专业化std :: hash的用户定义类型?
对于这个问题,我将“好”定义为简单实现和理解,效率相当高,不太可能产生散列表冲突.好的定义不包括有关安全性的任何声明.
什么是Google的状态
目前,两个StackOverflow问题是Google搜索“std哈希专业化”的第一个命中.
第一个,How to specialize std::hash::operator() for user-defined type in unordered containers?,讨论打开std命名空间是否合法,并添加模板专长.
第二个,How to specialize std::hash for type from other library,本质上是同样的问题.
这留下了现在的问题.鉴于C标准库的实现为标准库中的原始类型和类型定义了哈希函数,为用户定义的类型专门化std :: hash是一种简单有效的方法?有没有一个很好的方法组合标准库实现提供的哈希函数?
(编辑感谢dyp.)Another question在StackOverflow处理如何组合一对哈希函数.
其他Google结果没有什么帮助.
This Dobbs博士的文章指出,两个令人满意的散列的异或将产生一个新的令人满意的散列.
This文章似乎是从知识中讲出来的,并且意味着许多事情,但是对细节的阐述.它与Dobbs博士的文章在第一个例子中简要说明相矛盾,他说使用XOR组合哈希函数会产生弱的结果哈希函数.
因为XOR应用于任何两个相等的值会导致0,我可以看到为什么XOR本身很弱.
元问题
解释为什么这个问题是无效的,一般不能回答的一个很好的理由答案也是值得欢迎的.
解决方法
hash_combine
(std ::哈希不足),可以轻松地组合结构的各个数据成员的散列.
换一种说法:
>为您自己的类型重载boost :: hash_value.
>为您自己的类型专门化std :: hash,并使用boost :: hash_value实现.
这样你就能得到最好的std和boost世界,std :: hash<>和boost :: hash<>为您的类型工作.
更好的方法是在N3980 Types Don’t Know #使用所提出的新的散列基础架构.这种基础设施使得hash_combine不必要.