【问题标题】:Collisions when using stdext::hash_set/hash_map with object pointers将 stdext::hash_set/hash_map 与对象指针一起使用时发生冲突
【发布时间】:2013-08-28 19:42:09
【问题描述】:

我目前正在使用 MS VC++ 2008 及其提供的带有扩展的标准库。 我想使用散列容器来快速插入/删除/查找对象。所以我认为这应该很好用:

stdext::hash_set<MyOjbectClass*>

我发现默认哈希函数(我假设它只使用指针值)的冲突非常高。

当我在调试器中运行以下代码时:

stdext::hash_set<void*> hs;
for (int i=0; i<30; i++)
{
    hs.insert(new std::string());
}

我看到所有物品都放在同一个桶中! (捂脸) 尽管所有指针都是唯一的。所以我可以忘记 O(1)。

那么,让它高效工作的正确方法是什么?

提供自定义哈希函数?这样的指针哪个好?

注意:我需要使用 hash_map/hash_set。请不要提供使用 unordered_map/set 或 boost 等。

【问题讨论】:

    标签: c++ visual-studio-2008 pointers hashmap hashset


    【解决方案1】:

    经过一番搜索,我发现很少有哈希值。以下资源很有帮助:

    在此处找到 2 个函数:What is the best hash function for uint64_t keys ranging from 0 to its max value?

    这里有 1 个函数:http://naml.us/blog/2012/03

    经过一些测试,MurmurHash3 显示出对我来说最好的结果。它具有最佳性能。 3个散列函数的桶分布标准差几乎相同,比使用标准散列函数的情况要好很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多