/* hash function */ typedef unsigned int Index; Index Hash( const char *Key, int TableSize ) { unsigned int HashVal = 0; while( *Key != '\0' ) 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法则(javascript:void(0))来计算这个关于32的多项式。
如果关键字特别长,通常的做法是不使用所有的字符,比如,只使用奇数位置上的字符来实现它们的散列函数。