1. 程式人生 > >適用的字串hash函式

適用的字串hash函式

下面是綜合情況比較好的兩個字串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的冪次方
}