• 常用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效果最差,但得分相似,其算法本质是相似的。
     
  • 相关阅读:
    伪类样式
    div 文字超出边框后,省略号显示
    关于常用的 meta
    js数组去重
    异步二进制文件下载
    JJWT现前后端分离身份验证
    ApachePOI快速入门
    axios兼容ie7
    vue解决跨域问题
    log4j模板
  • 原文地址:https://www.cnblogs.com/duanxz/p/3506737.html
Copyright © 2020-2023  润新知