ELFHash函数用来得到字符串哈希值,现做分析:
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);
if ((x=hash & 0xf0000000)!=0)
hash ^= x >> 24;
hash &= ~x;
}
return (hash & 0x7fffffff);
}
- 返回值是一个unsigned int类型的数据,即4个字节,32位,用16进制表示为0xXXXXXXXX
- hash = (hash << 4) + (*str++)
hash左移四位,并加上str的值(即字符串第一个字符的值,类型为char,1个字节,8位),即str的高四位与hash值的5~8位相加,低四位直接填充在hash左移4位后的低四位。
if ((hash & 0xf0000000)!=0)
hash的值与0xf0000000相与,并且判断相与后的值是否为0,同时赋值给x。如果为0则说明字符不超过7个(因为每次左移4位,左移7次高4位还是0)。 如果不为0,则说明下一次左移4位时将会把高4位移出,所以需要做些操作,来让hash值记住现在的高4位。
- hash ^= x >> 24
即把现在的高4位与5~8位进行相与操作,得到hash值,这样做就能让即将在下一个字符操作时被移出的高四位影响hash值 - hash &= ~x
高4位与高四位取反相与操作,即完成高4位清零
- return (hash & 0x7fffffff)
返回hash值与0x7ffffff相与的数,即返回了一个最高位为0的无符号数,也就是个符号为正的int,这样做应该是为了防止在函数外使用时产生溢出,不需要负数。