问题
对于用户定义类型,其所有成员数据类型都已具有良好的std::hash专业化,作为std::unordered_map或std::unordered_set的第三个模板参数使用什么样的std::hash专业化效果最佳?
对于这个问题,我定义"好"是指易于实现和理解,效率合理,并且不太可能产生哈希表冲突。好的定义不包括任何关于安全性的声明。
可通过Google搜索获得的信息
目前,“std hash specialization” 的谷歌搜索结果的前两个链接是StackOverflow的两个问题。
第一个问题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的编辑) 另一个StackOverflow问题讨论了如何组合一对哈希函数。
其他谷歌搜索结果没有更多帮助。
这篇 Dr. Dobbs文章指出,两个满意哈希的异或将产生一个新的满意哈希。
这篇文章似乎具备专业知识并暗示了许多事情,但是细节不够充分。它在第一个示例的简要评论中与Dr. Dobbs的文章相矛盾,称使用异或运算符将哈希函数组合起来会得到一个弱的哈希函数。
因为异或应用于任何两个相等的值都会得到0,我能理解为什么单独使用异或会很弱。
元问题
一个合理的答案可以解释为什么这个问题无效并且不能被普遍回答,这也是受欢迎的。
元组
也不可哈希,参见https://dev59.com/MGw05IYBdhLWcg3wpTcV - dyp