gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:39:10 27 4
gpt4 key购买 nike

问题

什么是 std::hash 的良好特化,用于 std::unordered_map 或 std::unordered_set 的第三个模板参数,用于所有成员数据类型都已具有良好特化 std::的用户定义类型哈希?

对于这个问题,我将“好”定义为易于实现和理解、相当高效且不太可能产生哈希表冲突。良好的定义不包括任何关于安全的陈述。

Google 的现状

目前,有两个 StackOverflow 问题是 Google 搜索“std hash specialization”的首选。

第一个,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 上解决了如何组合散列函数的pair

其他谷歌结果没有更多帮助。

This Dobbs 博士的文章指出,两个令人满意的哈希值的异或将产生一个新的令人满意的哈希值。

This文章似乎是从知识中说话,暗示了很多东西,但对细节很轻。它与 Dobbs 博士在第一个示例中的简短评论中的文章相矛盾,称使用 XOR 组合哈希函数会导致结果哈希函数较弱。

因为对任何两个相等的值应用 XOR 的结果都是 0,所以我可以看到为什么 XOR 本身很弱。

元问题

一个合理的答案解释为什么这个问题是无效的并且一般不能回答也是受欢迎的。

最佳答案

一种简单的方法是使用 boost::hash图书馆和 extend it for your type .它有一个很好的扩展功能 hash_combine (std::hash 缺少这一点)允许轻松组合结构中各个数据成员的哈希值。

换句话说:

  1. 过载 boost::hash_value适合您自己的类型。
  2. 专业 std::hash为您自己的类型并使用 boost::hash_value 实现它.

这样您就可以充分利用 std 和 boost 世界,std::hash<>boost::hash<>适合你的类型。


更好的方法是使用 N3980 Types Don't Know # 中建议的新哈希基础架构.这个基础设施使得 hash_combine没必要。

关于c++ - 如何为用户定义的类型专门化 std::hash<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361884/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com