字符串哈希函数ELFHash的理解

unsigned long ElfHash ( const unsigned char *name )

{

unsigned long   h = 0, g;

while ( *name )

{

h = ( h << 4 ) + *name++;

if ( g = h & 0xF0000000 )//如果最高位不为0,则说明字符已经7个,如果不处理,再加第八个字符时,第一个字符会被移出

//因此要有如下处理是每一个字符都对字符串的值进行影响。

h ^= g >> 24;//将第一个字符去影响后面每一个字符的

h &= ~g;//清空28到31位。g的28位到31位于h的28位到31位完全相同,且g的其他位完全为0,所以g取反之后,与h相与,之后,

//h的28到31位清空,但是其他位都保留了下来。

}

return h;

}

时间: 2024-10-02 11:36:23

字符串哈希函数ELFHash的理解的相关文章

字符串哈希之ELFHash,poj2503

#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int M = 149993; typedef struct { char e[11]; char f[11]; int next; }Entry; Entry entry[M]; int i = 1; int hashIndex[M];//哈希表 int ELFHash(char *key) { unsig

几种哈希函数的比较

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有

常用哈希函数的比较及其C语言实现

基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2). 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢

经常使用哈希函数的比較及其C语言实现

基本概念 所谓完美哈希函数.就是指没有冲突的哈希函数.即对随意的 key1 != key2 有h(key1) != h(key2). 设定义域为X,值域为Y, n=|X|,m=|Y|.那么肯定有m>=n,假设对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时.常常要为每一个字符串分配一个整数ID.这就须要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数

字符串哈希 (转载)

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有

一个字符串的哈希函数

推荐网页: 云风的介绍Lua的. 一种对汉字更为环保的编码方案:不知道有没有人使用. 哈希函数一直对我来说都是比较神秘的东东,其实并不复杂,但是一个想要一个好的哈希函数不简单. 这个哈希函数,这是来自于云风的博客,来自于 Lua 的实现,说起他,一个人向中国推荐了 Lua 脚本,值得佩服. unsigned long hash(const char* name, size_t len){ unsigned long h = (unsigned long) len; size_t step = (

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

lintcode 128哈希函数

描述 在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如: hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % HASH_SIZE = (97* 333 + 98 * 332 + 99 * 33 +100)

字符串哈希模板C++实现

最近遇到了好几道字符串比较的题目,感觉直接比较还是挺耗时间的,于是想到了哈希,但是又觉得运算的时候可能会把int数据类型爆掉,所以在讨论哈希之前还是总结一下快速幂. 1.Quickpow 这是个模板,我总结了一下网络上的各种写法,比这短的反正我是不会的: int quickpow(int a,int b,int c) { // return (a^b)%c ---------- 把a的类型声明改成long long也许会更好 int ret = 1; a %= c; while(b){ if(b