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