`
zhaohaolin
  • 浏览: 1016385 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

常用hash算法及评测[转]

 
阅读更多
RS hash 算法
unsigned int RSHash(char* str, unsigned int len)
{
    unsigned int b    = 378551;
    unsigned int a    = 63689;
    unsigned int hash = 0;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = hash * a + (*str);
        a    = a * b;
    }
    return hash;
}
/* End Of RS Hash Function */
 
JS hash 算法
unsigned int JSHash(char* str, unsigned int len)
{
    unsigned int hash = 1315423911;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash ^= ((hash << 5) + (*str) + (hash >> 2));
    }
    return hash;
}
/* End Of JS Hash Function */
 
PJW hash 算法
unsigned int PJWHash(char* str, unsigned int len)
{
    const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);
    const unsigned int ThreeQuarters     = (unsigned int)((BitsInUnsignedInt * 3) / 4);
    const unsigned int OneEighth         = (unsigned int)(BitsInUnsignedInt / 8);
    const unsigned int HighBits          = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);
    unsigned int hash              = 0;
    unsigned int test              = 0;
    unsigned int i                 = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = (hash << OneEighth) + (*str);
        if((test = hash & HighBits) != 0)
        {
            hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
        }
    }
    return hash;
}
/* End Of P. J. Weinberger Hash Function */
 
ELF hash 算法
unsigned int ELFHash(char* str, unsigned int len)
{
    unsigned int hash = 0;
    unsigned int x    = 0;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = (hash << 4) + (*str);
        if((x = hash & 0xF0000000L) != 0)
        {
            hash ^= (x >> 24);
        }
        hash &= ~x;
    }
    return hash;
}
/* End Of ELF Hash Function */
 
BKDR hash 算法
unsigned int BKDRHash(char* str, unsigned int len)
{
    unsigned int seed = 131;
    /* 31 131 1313 13131 131313 etc.. */
    unsigned int hash = 0;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = (hash * seed) + (*str);
    }
    return hash;
}
/* End Of BKDR Hash Function */
 
SDBM hash 算法
unsigned int SDBMHash(char* str, unsigned int len)
{
    unsigned int hash = 0;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = (*str) + (hash << 6) + (hash << 16) - hash;
    }
    return hash;
}
/* End Of SDBM Hash Function */
 
DJB hash 算法
unsigned int DJBHash(char* str, unsigned int len)
{
    unsigned int hash = 5381;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = ((hash << 5) + hash) + (*str);
    }
    return hash;
}
/* End Of DJB Hash Function */
 
DEK hash 算法
unsigned int DEKHash(char* str, unsigned int len)
{
    unsigned int hash = len;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);
    }
    return hash;
}
/* End Of DEK Hash Function */
 
BP hash 算法
unsigned int BPHash(char* str, unsigned int len)
{
    unsigned int hash = 0;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash = hash << 7 ^ (*str);
    }
    return hash;
}
/* End Of BP Hash Function */
 
FNV hash 算法
unsigned int FNVHash(char* str, unsigned int len)
{
    const unsigned int fnv_prime = 0x811C9DC5;
    unsigned int hash      = 0;
    unsigned int i         = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash *= fnv_prime;
        hash ^= (*str);
    }
    return hash;
}
/* End Of FNV Hash Function */
 
AP hash 算法
unsigned int APHash(char* str, unsigned int len)
{
    unsigned int hash = 0xAAAAAAAA;
    unsigned int i    = 0;
    for(i = 0; i < len; str++, i++)
    {
        hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ (*str) * (hash >> 3)) :
            (~((hash << 11) + (*str) ^ (hash >> 5)));
    }
    return hash;
}
/* End Of AP Hash Function */
 
各种算法评测
Hash函数 数据1 数据2 数据3 数据4 数据1得分 数据2得分 数据3得分 数据4得分 平均分
BKDRHash 2 0 4774 481 96.55 100 90.95 82.05 92.64
APHash 2 3 4754 493 96.55 88.46 100 51.28 86.28
DJBHash 2 2 4975 474 96.55 92.31 0 100 83.43
JSHash 1 4 4761 506 100 84.62 96.83 17.95 81.94
RSHash 1 0 4861 505 100 100 51.58 20.51 75.96
SDBMHash 3 2 4849 504 93.1 92.31 57.01 23.08 72.41
PJWHash 30 26 4878 513 0 0 43.89 0 21.95
ELFHash 30 26 4878 513 0 0 43.89 0 21.95
其中
数据1为100000个字母和数字组成的随机串哈希冲突个数。
数据2为100000个有意义的英文句子哈希冲突个数。
数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。
数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。
经过比较,得出以上平均得分。平均数为平方平均数。
可以发现,
BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。
APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。
PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。
分享到:
评论

相关推荐

    【常用算法】MSYACM

    #### 常用Hash函数 Hash函数用于快速查找和避免冲突,常见的有MD5、SHA-1、SHA-256等。 #### 数据结构 - **树状数组**:支持动态数组的快速查询和更新操作,常用于区间查询问题。 - **1000以内的阶乘**:预先计算...

    2023年软件设计师考纲.doc

    * 数据结构与算法知识:数组、链表、队列、栈、树、图的定义、存储和基本操作、杂凑(Hash 表)、常用的排序算法、查找算法、数值计算、字符串解决、数据压缩算法、递归算法、图的相关算法、算法描述和分析 ...

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    数据库工程师考试大纲

    * 常用数据结构:数组、线性表、链表、栈和队列、树、图、集合的定义、存储和操作、Hash 存储位置计算、碰撞处理等。 * 常用算法:排序算法、查找算法、数值计算、字符串处理、数据压缩算法、递归算法、图的相关算法...

    2005-2009软件设计师历年真题

     1.6 常用算法  • 排序算法、查找算法、数值计算方法、字符串处理方法、数据压缩算法、递归算法、图的相关算法  • 算法与数据结构的关系、算法效率、算法设计、算法描述(流程图、伪代码、决策表)、算法的复杂...

    软件设计师课程体系结构

    通过本章节的学习,掌握数制、数据表示、数学应用、常用数据结构和算法等方面的基础知识。 ##### 重点与难点 - 数据的四种编码及其之间的转换方法。 - 浮点数的表示方法及其规格化。 - 图的存储与操作遍历。 - 算法...

    2012数据库系统工程师大纲

    - **常用数据结构**:如数组、链表、栈、队列、树、图、集合、Hash等,以及它们的定义、存储和操作方式。 - **常用算法**:涉及排序、查找、数值计算、字符串处理、数据压缩、递归、图算法等,以及算法的效率分析、...

    数据库系统工程师考试大纲

    - 常用数据结构:如数组、链表、栈、队列、树、图、集合和Hash表的定义、存储方式和操作。 - 常用算法:涵盖排序、查找、数值计算、字符串处理等,强调算法效率、设计和复杂性分析。 3. 软件知识: - 操作系统:...

    2009年软考数据库系统工程师考试大纲

    1. 常用数据结构:如数组、线性表、链表、栈、队列、树和图的定义、存储和操作,以及Hash表的基本原理。 2. 常用算法:排序、查找、数值计算、字符串处理、数据压缩、递归算法等,强调算法效率、设计和复杂性分析。...

    软设考试知识点和考试大纲

    - 安全性、可靠性和性能评测基础知识,包括故障诊断、系统可靠性分析和性能测试方法。 5. **软件知识**: - 操作系统核心概念,如中断、进程和线程,以及处理机管理、存储管理、设备管理、文件管理和作业管理。 ...

    比较全面的软件设计师考试大纲

    同时,熟悉Hash算法及其冲突处理策略,掌握排序、查找、数值计算、字符串处理、数据压缩、递归和图算法等,对提高软件性能和效率至关重要。 ### 计算机系统与架构 了解计算机系统的组成、体系结构分类和特性,包括...

    2011软件设计师考试大纲.pdf

    - **常用算法**:考察排序、查找、数值计算、字符串处理、数据压缩和递归等算法。 2. **计算机系统知识** - **硬件知识**:涵盖计算机系统的组成、CPU、存储器、I/O设备、接口、控制方式、CISC/RISC、并行处理等...

Global site tag (gtag.js) - Google Analytics