问题
对于所有成员数据类型都已经具有良好的 std::hash 特化的用户定义类型,在 std::unordered_map 或 std::unordered_set 的第三个模板参数中使用 std::hash 的好的特化是什么?
对于这个问题,我将“好”定义为易于实现和理解、相当有效且不太可能产生哈希表冲突。良好的定义不包括任何关于安全的陈述。
Google 的现状
目前,两个 StackOverflow 问题是 Google 搜索“std hash specialization”的第一名。
第一个,如何为无序容器中的用户定义类型专门化 std::hash::operator()?, 解决打开 std 命名空间和添加模板特化是否合法。
第二,How to special std::hash for type from other library基本上解决了同样的问题。
这就留下了当前的问题。鉴于 C++ 标准库的实现为标准库中的基本类型和类型定义了散列函数,那么将 std::hash 专门用于用户定义类型的简单而有效的方法是什么?有没有一种组合标准库实现提供的散列函数的好方法?
(感谢 dyp 编辑。) StackOverflow 上的另一个问题解决了如何组合一对哈希函数。
其他谷歌结果没有更多帮助。
Dobbs 博士的这篇文章指出,两个令人满意的散列的异或将产生一个新的令人满意的散列。
这篇文章似乎是从知识上讲的,暗示了很多东西,但细节却很轻。它与 Dobbs 博士在第一个示例中的简短评论中的文章相矛盾,他说使用 XOR 组合散列函数会导致生成的散列函数很弱。
因为 XOR 应用于任何两个相等的值会导致 0,所以我可以看到为什么 XOR 本身很弱。
元问题
一个合理的答案解释为什么这个问题是无效的并且一般不能回答也是受欢迎的。