如何计算std :: unordered_map的哈希码?

时间:2018-02-01 19:35:13

标签: c++ hashmap time-complexity hashcode stdmap

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

但是如何计算哈希码以提供唯一的密钥索引来访问表的成员(此外还有一个可以是任何类型的条目)?我猜计算本身可能很复杂(如MD5)以避免碰撞?

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

编辑:我写了std :: map而不是std :: unordered_map,现在修复了

4 个答案:

答案 0 :(得分:2)

std::map不是散列映射。

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

std::unordered_map是一个hashmap。

std::unordered_map已经(摊销)O(1)查询时间,并且由std::hash参数化,这取决于实现。

因此,没有人在整个实现中使用散列函数。

你可以自由地提供你自己的哈希函子,它实现了std::hash,但要注意:有说谎的龙。 很多研究用于快速制作不同的C ++实现。

答案 1 :(得分:2)

标准未指定无序映射的散列算法。图书馆实施者可以自行决定。它可能是MurmurHashUnaligned2,Fowler–Noll–Vo或其他东西。它的实现已定义。

答案 2 :(得分:2)

  

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

你把事情弄糊涂了。 C ++ 中的哈希表为std::unordered_map,可确保不断搜索/插入/删除复杂性。

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

答案 3 :(得分:1)

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

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