将stdext :: hash_set / hash_map与对象指针一起使用时的冲突

时间:2013-08-28 19:42:10

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

我目前正在使用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等。

1 个答案:

答案 0 :(得分:0)

经过一番搜索后,我发现了一些哈希值。以下资源很有用:

此处找到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个散列函数,桶分布的标准偏差几乎相同,并且比使用标准散列函数的情况要好得多。