C++通用hash函数模板

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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值