字符串Hash函数(ELFhash)

时间:2021-09-13 16:45:36

     百度,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函数来做。也不算很难吧。