2008年3月11日星期二

常用字符串Hash函数

// RS Hash Function
unsigned 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 Function
unsigned int JSHash(char *str)
{
    unsigned int  hash=1315423911;
    while(*str)
    {
        hash^=((hash << 5)+(*str++)+(hash>>2));
     }
    return (hash & 0x7fffffff);
}

//P.J Weinberger Hash Function
unsigned 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 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 Function
unsigned 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 Function
unsigned 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);
}

//SDBM Hash Function
unsigned int SDBMHash(char *str)
{
    unsigned int hash=0;
    while(*str)
    {
        hash+=(hash<<5)+(*str++);
    }
    return (hash & 0x7fffffff);
}

//AP Hash Function
unsigned 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);
}

//ELF hash Function比较常用

没有评论: