针对关键字是字符串的一个比较好的散列函数

/* hash function */

typedef unsigned int Index;
 
Index
Hash( const char *Key, int TableSize )        //Key为要散列的关键字, TableSize为散列表的大小
{
    unsigned int HashVal = 0;

    while( *Key != '' )
        HashVal = ( HashVal << 5 ) + *Key++;   //计算一个32的多项式(乘32用移位实现)

    return HashVal % TableSize;
}

这个散列函数涉及到关键字中的所有字符,并且一般可以分布得很好。

它计算Key[0] * 32^(KeySize-1) + Key[1] * 32^(KeySize-2) + Key[2] * 32^(KeySize-3) + …+Key[KeySize-1] * 32^0.

观察程序,可以发现,程序中并没有直接计算上面的关于32的多项式,而是使用了Horner法则(http://www.cnblogs.com/nufangrensheng/p/3633493.html)来计算这个关于32的多项式。

如果关键字特别长,通常的做法是不使用所有的字符,比如,只使用奇数位置上的字符来实现它们的散列函数。

原文地址:https://www.cnblogs.com/nufangrensheng/p/3635003.html