下面是综合情况比较好的两个字符串hash函数,就当做一个笔记吧:
unsigned int BKDRHash(char *str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc...
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
}
unsigned int JSHash(char *str)
{
unsigned int hash = 1315423911; // nearly a prime - 1315423911 = 3 * 438474637
if (*str == 0x00)
{
return 0;
}
while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
}
整型hash函数:
static int _GetIndex(unsigned int addr)
{
return (addr * 2654435769UL) >> 24;
}
static int indexFor(int hash, int length)
{
return hash & (length - 1); //一般长度应为2的幂次方
}