【发布时间】:2011-12-10 11:43:24
【问题描述】:
我想在哈希集中存储一组(智能)指针,<boost/unordered_set>。经过 10 秒的思考,我想出了这个哈希函数:
typedef boost::shared_ptr<myType> ref_t;
struct SharedPtrHash : public std::unary_function<ref_t, std::size_t> {
std::size_t operator()(ref_t const& obj) const {
return reinterpret_cast<std::size_t>( obj.get() );
}
};
我的问题是:这个哈希是个好主意吗?我认为这个哈希将有零或很少的冲突(也许引擎盖下有一些素数模数破坏了我所有的乐趣)。
更多细节:哈希的目的是回收大对象的存储,所以我需要一种快速的方法来检测一个大对象是否已经在 bin 中。
如果不是,什么是指针的理想哈希值,无论是智能指针还是哑指针?
【问题讨论】:
-
嗯,内存地址应该是唯一的,所以我(经过 5 秒的思考)会说你很好。
-
myType 可能有一个最小对齐,可能高达 8。这意味着所有结果都可以被 8 整除。不是最大的哈希,特别是因为可能有一个模数为 2 .
-
如果你想在你的键上使用对象身份来查找它是一个很好的哈希。如果你想要对象相等,这是一个错误。
-
好点@Mooing Duck。有什么建议可以在这里快速散列吗?
-
@Patrick,我知道,这是为了回收大对象的存储,所以身份很重要。但是 Mooing Duck 提出了一个很好的观点,即由于对齐而具有低熵的地址
标签: c++ hash unordered-set