std::unordered_map的hashcode是怎么计算出来的?
How is the hashcode of std::unordered_map calculated?
C++标准的无序映射std::unordered_map
是一个散列table数据结构,这意味着它具有恒定的访问时间复杂度O(1)。
但是如何计算散列码以提供唯一的键索引以访问 table 的成员(此外给定的条目可以是任何类型)?我想计算本身可能很复杂(如 MD5)以避免冲突?
在那种情况下,算法是否仍然足够快以在操纵 std::unordered_map
时将其视为可忽略不计?
编辑:我写的是 std::map 而不是 std::unordered_map,现在已修复
std::map
不是哈希图。
它是使用自平衡树实现的;因此,std::map
有 O(log n) 次查找时间。
std::unordered_map
是一个 hashmap。
std::unordered_map
has (amortized) O(1) lookup times, and it's parameterized by std::hash
,这取决于实现。
因此,没有一种哈希函数可以跨实现使用。
您可以自由提供自己的散列仿函数,只要它实现了 std::hash
,但要注意:那里有龙。 很多研究都致力于使不同的 C++ 实现更快。
标准未指定无序映射的哈希算法。由图书馆实施者决定。它可能是 MurmurHashUnaligned2、Fowler–Noll–Vo 或其他。它是实现定义的。
The unordered map of the C++ standard std::map is a hashtable data structure, which means it has a constant access time complexity O(1).
你把事情搞混了。 C++ 中的散列 table 是 std::unordered_map
,它保证了恒定的 search/insert/remove 复杂度。
哈希算法是实现定义的,您可以通过 std::hash
专业化提供自己的哈希。
默认的散列算法本身没有指定,只是它有一些要求(参考 [hash.requirements] 和 [unord.hash] 对无序关联容器的特殊性,如 unordered_map
):
- 如果
key1 == key2
,则hash(key1) == hash(key2)
hash(key)
不应抛出异常
- 必须实现为函数对象类型
- 必须是DefaultConstructible(无序关联容器)CopyConstructible和Destructible
- 必须是可交换的(无序关联容器)
hash(key)
应完全取决于 key
(因此散列总是 returns 相同键的相同值)
hash(key)
不得修改key
C++标准的无序映射std::unordered_map
是一个散列table数据结构,这意味着它具有恒定的访问时间复杂度O(1)。
但是如何计算散列码以提供唯一的键索引以访问 table 的成员(此外给定的条目可以是任何类型)?我想计算本身可能很复杂(如 MD5)以避免冲突?
在那种情况下,算法是否仍然足够快以在操纵 std::unordered_map
时将其视为可忽略不计?
编辑:我写的是 std::map 而不是 std::unordered_map,现在已修复
std::map
不是哈希图。
它是使用自平衡树实现的;因此,std::map
有 O(log n) 次查找时间。
std::unordered_map
是一个 hashmap。
std::unordered_map
has (amortized) O(1) lookup times, and it's parameterized by std::hash
,这取决于实现。
因此,没有一种哈希函数可以跨实现使用。
您可以自由提供自己的散列仿函数,只要它实现了 std::hash
,但要注意:那里有龙。 很多研究都致力于使不同的 C++ 实现更快。
标准未指定无序映射的哈希算法。由图书馆实施者决定。它可能是 MurmurHashUnaligned2、Fowler–Noll–Vo 或其他。它是实现定义的。
The unordered map of the C++ standard std::map is a hashtable data structure, which means it has a constant access time complexity O(1).
你把事情搞混了。 C++ 中的散列 table 是 std::unordered_map
,它保证了恒定的 search/insert/remove 复杂度。
哈希算法是实现定义的,您可以通过 std::hash
专业化提供自己的哈希。
默认的散列算法本身没有指定,只是它有一些要求(参考 [hash.requirements] 和 [unord.hash] 对无序关联容器的特殊性,如 unordered_map
):
- 如果
key1 == key2
,则hash(key1) == hash(key2)
hash(key)
不应抛出异常- 必须实现为函数对象类型
- 必须是DefaultConstructible(无序关联容器)CopyConstructible和Destructible
- 必须是可交换的(无序关联容器)
hash(key)
应完全取决于key
(因此散列总是 returns 相同键的相同值)hash(key)
不得修改key