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

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

概述问题 在std :: hash的第三个模板参数std :: unordered_map或std :: unordered_set中使用std :: hash的一个很好的专长是为所有成员数据类型已经具有很好的专业化std :: hash的用户定义类型? 对于这个问题,我将“好”定义为简单实现和理解,效率相当高,不太可能产生散列表冲突.好的定义不包括有关安全性的任何声明. 什么是Google的状态 目 问题

在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 – 如何为用户定义的类型专门化std :: hash?全部内容,希望文章能够帮你解决c – 如何为用户定义的类型专门化std :: hash?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1247157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存