百度,google了很多關於這個函數的用法。都大同小異,都只是給出了代碼,我覺得對我這個初學者來說有點難理解。所以,在這,我綜合一下我搜到的知識,把它再加深下印象吧。
ELFhash函數關鍵是要取得字符串對應的hash值。(別人的分析:它對於長字符串和短字符串都很有效,字符串中每個字符都有同樣的作用,它巧妙地對字符的ASCII編碼值進行計算,ELFhash函數對於能夠比較均勻地把字符串分布在散列表中。這些函數使用位運算使得每一個字符都對最后的函數值產生影響。)
ELFhash():參考http://blog.chinaunix.net/uid-24683784-id-3061386.html
int ELFhash(char *key){
unsigned long h=0;
unsigned long x=0;
while(*key)
{
h=(h<<4)+(*key++); //h左移4位,當前字符ASCII存入h的低四位
if( (x=h & 0xF0000000L)!=0)
{ //如果最高位不為0,則說明字符多余7個,如果不處理,再加第九個字符時,第一個字符會被移出
//因此要有如下處理
h^=(x>>24);
//清空28~31位
h&=~x;
}
}
return h % N;
}
關鍵還是要在實際應用中才能更深刻的把這個算法理解。如果 感興趣,可以看我 ACM 字符串 標簽里的poj2503題解,這題可以用ELFhash函數來做。也不算很難吧。