一个万用的hash function

  • 哈希函数:
      一般的线性表,树中,记录在结构中的相对位置是随机的,既和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上,查找的效率依赖于查找过程中所进行的比较次数。理想的情况下是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立的对应关系f。使每个关键字的结构中一个唯一的存储位置相对应。
      下面从侯捷老师的书中摘取了一部分的关于一个万用的Hash Function 的实现形式:
#include<functional>
class Customer {
    ...;
};

//CustomerHash 的形式一
class CustomerHash {
public:
    std::size_t operator ()(const Customer &c)const
    {
        return ...;
    }
};
unordered_set<Customer, CustomerHash>custset;

/*  
//CustomerHash 的形式二
size_t customer_hash_func(const Customer& c){
return ...;
};

unordered_set<Customer,size_t(*)(Customer&)>custset(20,customer_hash_func);
*/

//CustomerHash 的形式三 :以struct hash偏特化形式实现 Hsah Function
// 一个万用的Hash Function 如下:
#include<functional>

template<typename T>
inline void hash_combine(size_t &seed, const T& val) {
    seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);  //0x9e3779b9
}
//auxiliary generic functions
template<typename T>
inline void hash_val(size_t &seed, const T & val) {
    hash_combine(seed, val);
}

template<typename T,typename... Types>
inline void hash_val(size_t & seed, const T& val, const Types &...args) //逐一取val改变seed(pass by reference)
{
    hash_combine(seed, val);
    hash_val(seed, args...);
}
//auxiliary generic function
template<typename... Types>
inline size_t hash_val(const Types&args...) //seed最终就被视为hash code
{
    size_t seed = 0;
    hash_val(seed, arg...);
    return seed;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值