ELFhash,一种对字符串求hash值的函数,最后模槽数。
h(hash)是最后求得的hash值,对字符串中每一个字符进行遍历。
思路:每次h左移四位,将key的ASCII放入。由于long32位,当存到第7个字符的时候,最高的4位被填满了,下一次再左移4位就会发生数据丢失,因此,要处理这种情况。
unsigned long g=h&0xf0000000L;这一行 ,g存的是h的最高4位,0xf0000000=11110000000000000000000000000000,4个1,28个0,这样&过就是最高4位。
如果最高4位有值,首先将g右移24位,然后和h异或得到新值,这样,溢出的可能就被处理掉,然后h&=~g;最高4位清0,~g和h的高4位每一位相反,&上就是0,。
最终模上槽位,求出哈希值。
int ELFHash(char * key)
{
unsigned long h=0;
while(*key)
{
h=(h<<4)+*key++;
unsigned long g=h&0xf0000000L;
if(g)
{
h^=(g>>24);
h&=~g;
}
}
return h%M;
}