C++通用hash函数模板
——摘自侯捷《C++ STL 体系结构与内核分析》
#include <functional>
#include <iostream>
//假设有一个结构体Stu
struct Stu {
std::string name;
uint8_t age;
};
//为Stu写一个Hsash函数
class Hash {
public:
Hash() {}
virtual ~Hash () {}
public:
//1
std::size_t operator()(const Stu& s) {
return hash_val(s.name, s.age);
}
//2
template<typename...Types>
inline std::size_t hash_val(const Types&... args) {
std::size_t seed = 0;
hash_val(seed, args...);
return seed;
}
//3
template<typename T, typename... Types>
inline void hash_val(std::size_t& seed, const T& val, const Types&... args) {
hash_combine(seed, val);
hash_val(seed, args...);
}
//4
template<typename T>
inline void hash_combine(std::size_t& seed, const T& val) {
seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
//5,在szieof args... = 1时(递归结束)调用
template<typename T>
inline void hash_val(std::size_t& seed, const T& val) {
hash_combine(seed, val);
}
};
int main(void)
{
Stu s1{
"helo",
22
};
Stu s2{
"helo2",
22
};
std::cout << Hash()(s1) << std::endl;
std::cout << Hash()(s2) << std::endl;
return 0;
}