【问题标题】:How to identify whether or not std::unordered_map has experienced hash collisions?如何识别 std::unordered_map 是否经历过哈希冲突?
【发布时间】:2018-02-18 15:20:44
【问题描述】:

如何识别std::unordered_map 中的键是否经历过哈希冲突?

也就是说,如何识别是否存在碰撞链?

【问题讨论】:

  • 我怀疑如果是这种情况你想强制执行一些策略,然后要求 unordered_map 强制执行它,不要尝试从客户端代码强制执行它。检查 max_load_factor 成员函数是否解决了下面的问题。

标签: c++ stl collision unordered-map hash-collision


【解决方案1】:

您可以使用bucket interface 及其bucket_size 方法。

std::unordered_map<int, int> map;
bool has_collision = false;

for(size_t bucket = 0; bucket < map.bucket_count(); bucket++) {
    if(map.bucket_size(bucket) > 1) {
        has_collision = true;
        break;
    }
}

【讨论】:

  • 如果两个元素恰好在同一个桶中,并不意味着存在哈希冲突。
  • @Revolver_Ocelot -- 确实如此;这就是碰撞的定义。
  • 一个简单的if (map.bucket_count() &lt; map.size())可以快速检查是否有冲突,避免很多情况下的for循环
猜你喜欢
  • 2013-06-12
  • 2011-01-08
  • 1970-01-01
  • 2015-09-14
  • 2015-06-29
  • 2016-08-29
  • 2019-03-25
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多