c – 如何为用户定义的类型专门化std :: hash?

问题

在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本身很弱.

元问题

解释为什么这个问题是无效的,一般不能回答的一个很好的理由答案也是值得欢迎的.

解决方法

一个简单的方法是使用boost :: hash库和 extend it for your type.它有一个很好的扩展功能 hash_combine(std ::哈希不足),可以轻松地组合结构的各个数据成员的散列.

换一种说法:

>为您自己的类型重载boost :: hash_value.
>为您自己的类型专门化std :: hash,并使用boost :: hash_value实现.

这样你就能得到最好的std和boost世界,std :: hash<>和boost :: hash<>为您的类型工作.

更好的方法是在N3980 Types Don’t Know #使用所提出的新的散列基础架构.这种基础设施使得hash_combine不必要.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...