问题:为什么Hash表的size总是扩展成一个素数?
分析:素数可以有效地减少冲突。具体原因如下
假设Hash表的大小为size,这是一个合数,即有size = a * n,当有Hash值为HashCode = b * n,则
HashCode取模之后有:
HashCode = HashCode mod size
= HasdCode - HashCode/size * size
= HashCode - b/a *size
因为是固定不变的,那么HashCode取值就有了种可能,这样显然会增加冲突的概率。
ELF hash字符串hash函数
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
}
BKDR 字符串hash函数
unsigned int BKDRHash(char*str)
{
unsigned int seed=131 ;
unsigned int hash=0 ;
while(*str)
{
hash=hash*seed+(*str++);
}
return(hash % SIZE);
}