std::unordered_map 的哈希代码是如何计算的

How is the hashcode of std::unordered_map calculated?

本文关键字:何计算 计算 代码 unordered map 哈希 std      更新时间:2023-10-16

C++标准std::unordered_map的无序映射是一个哈希表数据结构,这意味着它具有恒定的访问时间复杂度O(1(。

但是如何计算哈希代码以提供唯一的键索引来访问表的成员(此外,给定可以是任何类型的条目(?我想计算本身可能很复杂(如MD5(以避免碰撞?

在这种情况下,算法是否仍然足够快,可以在操作std::unordered_map时将其忽略不计?

编辑:我写了std::

map而不是std::unordered_map,现在已经修复了

std::map不是哈希图。

它是使用自平衡树实现的;因此,std::map具有 O(log n( 查找时间。

std::unordered_map是一个哈希图。

std::unordered_map具有(摊销(O(1( 查找时间,并且由 std::hash 参数化,这取决于实现。

因此,没有一个跨实现使用的哈希函数。

您可以自由提供自己的哈希函子,前提是它实现了std::hash,但要注意:那里有龙。为了快速实现不同的C++,进行了大量研究。

C++标准 std::map 的无序映射是一个哈希表数据结构,这意味着它具有恒定的访问时间复杂度 O(1(。

你混淆了这些东西。C++中的哈希表是std::unordered_map,这保证了恒定的搜索/插入/删除复杂性。

哈希

算法是实现定义的,您可以通过std::hash专用化提供自己的哈希。

标准未指定无序映射的哈希算法。由库实现者决定。它可能是MurmurHashUnaligned2,Fowler-Noll-Vo或其他东西。它是实现定义的。

默认哈希算法本身没有指定,只是它有一些要求(请参阅 [hash.requirements] 和 [unord.hash] 了解对无序关联容器(如 unordered_map (的特殊性(:

  • 如果key1 == key2,则hash(key1) == hash(key2)
  • hash(key)不应引发异常
  • 它必须实现为函数对象类型
  • 它必须是 DefaultConstructible(无序关联容器(CopyConstructible 和 Destructable
  • 必须是可交换的(无序关联容器(
  • hash(key)应完全取决于key(因此哈希始终为同一键返回相同的值(
  • hash(key)不得修改密钥