c++ - 如何直接使用 key 作为 std::unordered_map 的哈希值?

标签 c++ hash std uuid unordered-map

我的 std::unordered_map 中的键是 boost::uuids::uuid s,因此 128 位哈希值被认为是唯一的。然而,编译器无法知道这一点,因此会这样说。

error C2338: The C++ Standard doesn't provide a hash for this type.

如何让 map 按原样使用键作为哈希值?顺便说一句,std::size_t 在我的系统上被定义为 unsigned int __w64,我认为它仅指 64 位。

最佳答案

您始终需要提供一个将键映射到哈希值的函数对象,即使此映射是身份。您可以为 std::hash<boost::uuids::uuid> 定义特化并有 std::unordered_map<K, V>自动选择这个,或者您可以使用函数对象类型的附加模板参数参数化无序映射。除了哈希之外,还需要相等操作,但默认使用 operator==()可能没问题。

也就是说,哈希值不会接受 128 位整数,除非您的系统具有内置的 128 位整数类型。哈希值需要是 std::size_t可与标准无序容器一起使用。 std::hash<T> 的完整要求列表特化在 20.8.12 [unord.hash] 中列出:

  1. std::hash<X>需要默认可构造、可复制构造和可复制分配。
  2. std::hash<X>需要可交换。
  3. 需要提供两个嵌套类型 argument_type对于 key 类型和 result_type哈希值的类型,后者与 std::size_t 相同.
  4. 对于函数,关系 k1 == k2 => h(k1) == h(k2)需要为 true,其中 h是哈希函数对象。

因此,您需要按照以下方式定义一些内容:

namespace std {
    template <>
    struct hash<boost::uuids::uuid>
    {
        typedef boost::uuids::uuid argument_type;
        typedef std::size_t        result_type;
        std::size_t operator()(boost::uuid::uuid key) const {
            return transform_to_size_t(key);
        }
    };
}

哪里transform_to_size_t()是您需要提供的实际转换。 };

关于c++ - 如何直接使用 key 作为 std::unordered_map 的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548585/

相关文章:

ruby - 如何将散列保存到 CSV 中

ruby - 如何迭代 Ruby 中的哈希值的一部分?

c++ - std::列表迭代器

c++ - 当控件定义了 ON_NOTIFY_REFLECT 时,ON_NOTIFY 在我的对话框中不起作用

c++ - 提振 spirit ,递归和堆栈溢出

c++ - CUDA 并发内核启动不起作用

c++ - 在Windows上打开的C++文件始终失败

regex - 如何将不同的键映射到相同的值但只声明一次?

c++ - Eigen 库成员上 nth_element 的默认策略是什么?

c++ - 按修改时间在c++中排序文件