字符串哈希算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)