ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – unordered_set:指针地址是一个好的哈希?

2019-09-02 23:06:27  阅读:162  来源: 互联网

标签:unordered-set c hash


我想在哈希集中存储一组(智能)指针,< 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中.

万一它不是,什么是指针的理想哈希,无论是聪明的还是愚蠢的?

解决方法:

如果要检测不相同的对象,即使它们的内容可能相等,您也别无选择,只能在哈希中使用对象的地址.唯一的问题是是直接使用地址还是通过公式运行它.除以sizeof(mytype)会收紧分布中的漏洞.

编辑:这是一个未经测试的模板实现,它应该适用于所有shared_ptr类型,以及一个equal_to函数来完成std :: unordered_set的要求.如果您有其他对象需要基于值而不是指针的散列,请不要使用此通用实现.

template<typename T>
size_t hash(const std::shared_ptr<T> & ptr)
{
    return ((size_t) ptr.get()) / sizeof(T);
}

template<typename T>
bool equal_to(const std::shared_ptr<T> & left, const std::shared_ptr<T> & right)
{
    return left.get() == right.get();
}

标签:unordered-set,c,hash
来源: https://codeday.me/bug/20190902/1793845.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有