8个常用的字符串哈希函数

来源:互联网 发布:国家标准人体尺寸数据 编辑:程序博客网 时间:2024/04/29 08:26

最有用的两个

unsigned long long hash; // hash使用unsigned long long,超过了unsigned long long就相当于取模//常用11  SDBMHashint SDBMHash(char *str){    hash = 0;    while (*str) hash = (*str++) + (hash << 6) + (hash << 16) - hash;    return hash;}//常用2 int BKDRHash(char *str){    int seed = 131;     int hash = 0;    while (*str) hash = hash * seed + (*str++);    return hash;}


常见的8个

const int MAXN = 1000003;//常用 11  SDBMHashunsigned 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)%MAXN;} 2  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)%MAXN;} 3 JS Hash Functionunsigned int JSHash(char *str){    unsigned int hash = 1315423911;     while (*str)    {        hash ^= ((hash << 5) + (*str++) + (hash >> 2));    }    return (hash & 0x7FFFFFFF)%MAXN;} 4 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)%MAXN;} 5 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)%MAXN;} //常用2 6 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)%MAXN;} 7 DJB Hash Functionunsigned int DJBHash(char *str){    unsigned int hash = 5381;    while (*str)    {        hash += (hash << 5) + (*str++);    }    return (hash & 0x7FFFFFFF)%MAXN;} 8 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)%MAXN;}