std::unordered_map 的哈希代码是如何计算的
How is the hashcode of std::unordered_map calculated?
C++标准std::unordered_map
的无序映射是一个哈希表数据结构,这意味着它具有恒定的访问时间复杂度O(1(。
但是如何计算哈希代码以提供唯一的键索引来访问表的成员(此外,给定可以是任何类型的条目(?我想计算本身可能很复杂(如MD5(以避免碰撞?
在这种情况下,算法是否仍然足够快,可以在操作std::unordered_map
时将其忽略不计?
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)
不得修改密钥
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- C++ openmp 并行计算计算错误的结果