1、ELFHash
unsigned int ELFHash( char * str)
{
unsigned int hash = 0 ;
unsigned int x = 0 ;
while ( * str)
{
hash = (hash < < 4 ) + ( * str ++ ); //hash值左移4位加上一个字符
if ((x = hash & 0xF0000000L ) != 0 )//判断hash值的高4位是否不为0,因为不为0时需要下面特殊处理,否则上面一步的左移4位会把这高四位给移走,造成信息丢失
{
hash ^= (x >> 24 ); //把刚才的高4位跟hash的低5-8位异或
hash &= ~ x; //把高4位清0
}
}
return (hash & 0x7FFFFFFF ); //希望hash值是一个非负数
}
2、限定下标最大值的EFLHash
unsigned int ELFHash( char * str, unsigned int max)
{
unsigned int hash = 0 ;
unsigned int x = 0 ;
while ( * str)
{
hash = (hash < < 4 ) + ( * str ++ ); //hash值左移4位加上一个字符
if ((x = hash & 0xF0000000L ) != 0 )//判断hash值的高4位是否不为0,因为不为0时需要下面特殊处理,否则上面一步的左移4位会把这高四位给移走,造成信息丢失
{
hash ^= (x >> 24 ); //把刚才的高4位跟hash的低5-8位异或
hash &= ~ x; //把高4位清0
}
}
return (hash & 0x7FFFFFFF ) % max; //希望hash值是一个非负数
}
阅读(1296) | 评论(0) | 转发(1) |