hash()函数的实现

122 篇文章 1 订阅
31 篇文章 1 订阅

输入参数都是字符串。

6种hash函数的实现以及使用方式:


template<class T>
size_t BKDRHash(const T * str) // 该效率最高
{
    register size_t hash = 0;
    while (size_t ch = (size_t)*str++)
    {
        hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..         
    }
    return hash;
}
template<class T>
size_t SDBMHash(const T *str)
{
    register size_t hash = 0;
    while (size_t ch = (size_t)*str++)
    {
        hash = 65599 * hash + ch;
        //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
    }
    return hash;
}
template<class T>
size_t RSHash(const T *str)
{
    register size_t hash = 0;
    size_t magic = 63689;
    while (size_t ch = (size_t)*str++)
    {
        hash = hash * magic + ch;
        magic *= 378551;
    }
    return hash;
}
template<class T>
size_t APHash(const T *str)
{
    register size_t hash = 0;
    size_t ch;
    for (long i = 0; ch = (size_t)*str++; i++)
    {
        if ((i & 1) == 0)
        {
            hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
        }
        else
        {
            hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
        }
    }
    return hash;
}
template<class T>
size_t JSHash(const T *str)
{
    if (!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
        return 0;
    register size_t hash = 1315423911;
    while (size_t ch = (size_t)*str++)
    {
        hash ^= ((hash << 5) + ch + (hash >> 2));
    }
    return hash;
}
template<class T>
size_t DEKHash(const T* str)
{
    if (!*str)        // 以保证空字符串返回哈希值0  
        return 0;
    register size_t hash = 1315423911;
    while (size_t ch = (size_t)*str++)
    {
        hash = ((hash << 5) ^ (hash >> 27)) ^ ch;
    }
    return hash;
}


//6个仿函数分别进行6种字符串算法的调用
template<class T>
struct _HashFunc1
{
    size_t operator()(const T& str)
    {
        return BKDRHash(str.c_str());
    }
};
template<class T>
struct _HashFunc2
{
    size_t operator()(const T& str)
    {
        return SDBMHash(str.c_str());
    }
}; 
template<class T>
struct _HashFunc3
{
    size_t operator()(const T& str)
    {
        return RSHash(str.c_str());
    }
}; 
template<class T>
struct _HashFunc4
{
    size_t operator()(const T& str)
    {
        return APHash(str.c_str());
    }
}; 
template<class T>
struct _HashFunc5
{
    size_t operator()(const T& str)
    {
        return JSHash(str.c_str());
    }
};
template<class T>
struct _HashFunc6
{
    size_t operator()(const T& str)
    {
        return DEKHash(str.c_str());
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值