字符串哈希算法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经典字符串Hash函数

工作中经常需要用大hash这个强有力的工具,hash表最核心的部分则在于怎么设计一个好的hash函数,以使数据更均匀地分布在若干个桶上。下面来介绍一下我现在用到的一个hash函数,我们来看代码:

unsigned chostcachehash::get_host_key(const string& host)

{

int result = 1;

unsigned i = 0;

for (i = 0; i

result = 31 * result + host[i];

return abs(result);

}

inline unsigned getkey(unsigned key)

{

return (key % m_capacity);

}

m_capacity为hash桶的个数

对于一个字符串,我们首先调用get_host_key()来得到一个key,然后再用这个key调用getkey来得到他在hash桶里的位置。这个是我们在工作一直使用的hash函数,效果也还可以。今天忽然心血来潮,在网上搜了一下看还有没有更好的hash函数,被我发现了这篇文章,于是转过来看看。

php中出现的字符串hash函数

static unsigned long hashpjw(char *arkey,unsigned intnkeylength)

{

unsigned long h = 0,g;

char *arend=arkey+nkeylength;

while (arkey

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

if ((g = (h & 0xf0000000))) {

h = h ^ (g >> 24);

h = h ^ g;

}

}

return h;

}

openssl中出现的字符串hash函数

unsigned long lh_strhash(char *str)

{

int i,l;

unsigned long ret=0;

unsigned short *s;

if (str == null) return(0);

l=(strlen(str)+1)/2;

s=(unsigned short *)str;

for (i=0; i %有点看不懂

ret^=(s[i]<<(i&0x0f));

return(ret);

} */

/* the following hash seems to work very well on normal text strings * no collisions on /usr/dict/words and it distributes on %2^n quite

* well,not as good as md5,but still good.

*/

unsigned long lh_strhash(const char *c)

{

unsigned long ret=0;

long n;

unsigned long v;

int r;

if ((c == null) || (*c == "{post.abstract}"))

return(ret);

/*

unsigned char b[16];

md5(c,strlen(c),b);

return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));

*/

n=0x100;

while (*c)

{

v=n|(*c);

n+=0x100;

r= (int)((v>>2)^v)&0x0f;

ret=(ret<>(32-r));

ret&=0xffffffffl;

ret^=v*v;

c++;

}

return((ret>>16)^ret);

}

mysql中出现的字符串hash函数

#ifndefnew_hash_function

/* calchashvalue for a key */

static uintcalc_hashnr(const byte *key,uint length)

{

register uint nr=1,nr2=4;

while (length--)

{

nr^= (((nr & 63)+nr2)*((uint) (uchar) *key++))+ (nr << 8);

nr2+=3;

}

return((uint) nr);

}

/* calchashvalue for a key,case indepenently */

static uintcalc_hashnr_caseup(const byte *key,uint length)

{

register uint nr=1,nr2=4;

while (length--)

{

nr^= (((nr & 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr << 8);

nr2+=3;

}

return((uint) nr);

}

#else

/*

* fowler/noll/vo hash

*

* the basis of the hash algorithm was taken from an idea sent by email to the * ieeeposix p1003.2 mailing list from phongvo (kpv@) and * glenn fowler (gsf@). landon curt noll (chongo@) * later improved on their algorithm.

*

* the magic is in the interesting relationship between the special prime

* 16777619 (2^24 + 403) and 2^32 and 2^8.

*

* this hash produces the fewest collisions of any function that we"ve seen so * far,and works well on both numbers and strings.

*/

uintcalc_hashnr(const byte *key,uintlen)

相关文档
最新文档