经典hash算法比较和C语言实现

Posted 区块链兄弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典hash算法比较和C语言实现相关的知识,希望对你有一定的参考价值。

点击蓝字,轻松关注

原文链接:http://t.cn/E5ZTjmU

本文约3100字+,阅读(观看)需要18分钟



常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。


常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。



其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。


经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。


在信息修竞赛中,要本着易于编码调试的原则,个人认为BKDRHash是最适合记忆和使用的。


附:各种哈希函数的C语言程序代码


unsigned int SDBMHash(char *str)
{    unsigned int hash = 0;    while (*str)
    {        // equivalent to: hash = 65599*hash + (*str++);
        hash = (*str++) + (hash << 6) + (hash << 16) - hash;
    }    return (hash & 0x7FFFFFFF);
}// RS Hash Functionunsigned int RSHash(char *str)
{    unsigned int b = 378551;    unsigned int a = 63689;    unsigned int hash = 0;    while (*str)
    {
        hash = hash * a + (*str++);
        a *= b;
    }    return (hash & 0x7FFFFFFF);
}// JS Hash Functionunsigned int JSHash(char *str)
{    unsigned int hash = 1315423911;    while (*str)
    {
        hash ^= ((hash << 5) + (*str++) + (hash >> 2));
    }    return (hash & 0x7FFFFFFF);
}// P. J. Weinberger Hash Functionunsigned int PJWHash(char *str)
{    unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);    unsigned int ThreeQuarters    = (unsigned int)((BitsInUnignedInt  * 3) / 4);    unsigned int OneEighth        = (unsigned int)(BitsInUnignedInt / 8);    unsigned int HighBits         = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);    unsigned int hash             = 0;    unsigned int test             = 0;    while (*str)
    {
        hash = (hash << OneEighth) + (*str++);        if ((test = hash & HighBits) != 0)
        {
            hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
        }
    }    return (hash & 0x7FFFFFFF);
}// ELF Hash Functionunsigned int ELFHash(char *str)
{    unsigned int hash = 0;    unsigned int x    = 0;    while (*str)
    {
        hash = (hash << 4) + (*str++);        if ((x = hash & 0xF0000000L) != 0)
        {
            hash ^= (x >> 24);
            hash &= ~x;
        }
    }    return (hash & 0x7FFFFFFF);
}// BKDR Hash Functionunsigned int BKDRHash(char *str)
{    unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
    unsigned int hash = 0;    while (*str)
    {
        hash = hash * seed + (*str++);
    }    return (hash & 0x7FFFFFFF);
}// DJB Hash Functionunsigned int DJBHash(char *str)
{    unsigned int hash = 5381;    while (*str)
    {
        hash += (hash << 5) + (*str++);
    }    return (hash & 0x7FFFFFFF);
}// AP Hash Functionunsigned int APHash(char *str)
{    unsigned int hash = 0;    int i;    for (i=0; *str; i++)
    {        if ((i & 1) == 0)
        {
            hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
        }        else
        {
            hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
        }
    }    return (hash & 0x7FFFFFFF);
}


文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。


猜猜你喜欢


2019智能合约开发新趋势


点击“阅读原文”参与区块链问题讨论

以上是关于经典hash算法比较和C语言实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法各种字符串Hash函数比较

c语言经典算法---计算Fibonacci数列

几种经典的Hash算法的实现(源代码)

用C语言和分治算法 求最近的两点的距离~

c语言实现*/遗传算法改进BP神经网络原理和算法实现怎么弄

有啥经典的c语言算法书推荐一下吗