字符串Hash:ELFhash 函数及其变体
2016-10-09 00:05
357 查看
hash table 中数据的插入和查找都需要先计算key 的hash 值
对于数值来说,常见的hash 方法有直接取余,平方取中等
对于字符串,常用的方法有*折叠法,ELFHash等
折叠法即把所有字符的ASCII码相加
ELFHash 用于Unix 系统的“可执行链接格式,ELF”,因此这里把它写为C函数:
关于ELFhash 的更多内容,可以参考http://blog.chinaunix.net/uid-24683784-id-3061386.html
在实际项目中接触到了一种HASH 算法,将任意字符串HASH映射到0到某一指定的范围内,算是ELFhash 的一种变体
上面的stringHash 函数实现了将任意字符串映射到[0,maxHashValue ] 范围内
对于数值来说,常见的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 ] 范围内
相关文章推荐
- hdu 1800 字符串的hash(BKDRHash 模版)大牛推荐的函数
- poj 3087 模拟(ELFHash模版,字符串哈希)
- 字符串及其操作函数
- ELFHash字符串Hash算法
- 有关字符串中的函数及其部分面试题
- 得到字符串中汉字的个数的函数及其说明
- C语言回顾(四、字符串及其处理函数重写)——iOS开发基础
- 字符串截取函数substr和substring的不同及其相关说明
- 写一个函数,用来把一个字符串用指定的字符作为分隔符分割成若干个子串输出 | 写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址
- ELF Hash Function(哈希表处理字符串)
- C语言温习(字符串及其函数)
- c++字符串处理函数及其用法
- range()函数常和len()函数一起用于字符串索引。在这里我们要显示每一个元素及其索引值。
- 字符串hash 函数模板
- 字符串Hash函数(ELFhash)
- 函数strcat的变体用于连接任意多个字符串
- Hash 函数及其重要性
- ELFhash - 优秀的字符串哈希算法
- 字符串哈希之ELFHash,poj2503
- 后台开发学习(七)PHP字符串及其函数