微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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不必要.

原文地址:https://www.jb51.cc/c/114784.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐