hash table 中数据的插入和查找都需要先计算key 的hash 值
对于数值来说,常见的hash 方法有直接取余,平方取中等
对于字符串,常用的方法有*折叠法,ELFHash等
折叠法即把所有字符的ASCII码相加
ELFHash 用于Unix 系统的“可执行链接格式,ELF”,因此这里把它写为C函数:
int ELFhash(char* key)
{
unsigned long h = 0;
unsigned long g = 0;
while(*key)
{
h = (h<<4) + *key++;
if( (g = h & 0xF0000000L) != 0)
{
h ^= (g >>24);
h &= ~g;
}
}
return h % M;
}
关于ELFhash 的更多内容,可以参考http://blog.chinaunix.net/uid-24683784-id-3061386.html
在实际项目中接触到了一种HASH 算法,将任意字符串HASH映射到0到某一指定的范围内,算是ELFhash 的一种变体
#include<iostream>
#include<string>
const int maxHashValue = 20000;
int stringHash(std::string & str)
{
int key = 0;
int isum = 0;
for(std::string::iterator i = str.begin(); i != str.end() ; ++i)
{
isum = ( (isum<<5) -isum ) + (int)(*i);
}
key = isum % maxHashValue;
return key;
}
int main(int agrc,char * argv[])
{
std::string inputString = "testInputString2";
std::cout<<stringHash(inputString)<<std::endl;
return 0;
}
上面的stringHash 函数实现了将任意字符串映射到[0,maxHashValue ] 范围内