您的位置:首页 > 编程语言 > C语言/C++

字符串Hash:ELFhash 函数及其变体

2016-10-09 00:05 357 查看
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 ] 范围内
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hash 算法 string C++