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和boost世界,std :: hash<>和boost :: hash<>为您的类型工作. 更好的方法是在N3980 Types Don’t Know #使用所提出的新的散列基础架构.这种基础设施使得hash_combine不必要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |