Hash 函数大全

    看到了几个Hash 函数的计算方法,因此想把所见到的所有Hash code 的计算方法的算法罗列出来。会陆续追加看到的Hash 的算法。 

第一种:  这是MySql 中计算Hash Code 的一个代码

inline Uint32 Hash( const char* str ){
  Uint32 h = 0;
  Uint32 len = strlen(str);
  while(len >= 4){
    h = (h << 5) + h + str[0];
    h = (h << 5) + h + str[1];
    h = (h << 5) + h + str[2];
    h = (h << 5) + h + str[3];
    len -= 4;
    str += 4;
  }
  
  switch(len){
  case 3:
    h = (h << 5) + h + *str++;
  case 2:
    h = (h << 5) + h + *str++;
  case 1:
    h = (h << 5) + h + *str++;
  }
  return h + h;
}

 

 第二种:这是linux 中计算path hash code 的算法

unsigned long hash (const char * str)
{
      unsigned long hs = 0 ;
      while(*str) {hs = (hs + (* str << 4) + ( * str ++ >> 4))  * 11 ;}
      return hs;
}

第三种:这是Java String 类计算Hash code 的算法
int   hash(const char * str,int len)
{
       int h = 0 ,i ;
       for(i = 0 ; i < len ; i ++) ...{
             h = h * 31 + str[i];
       }
}

第四种:OpenSSL 项目中lhash.c 文件提供两种HashCode 的计算方法
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<l; i++)
      ret^=(s[i]<<(i&0x0f));
     return(ret);
}

第五种:OpenSSL 项目中lhash.c 文件提供的第儿种HashCode 的计算方法
/* 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 == '/0'))
           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<<r)|(ret>>(32-r));
ret&=0xFFFFFFFFL;
ret^=v*v;
c++;
}
return((ret>>16)^ret);
}

第六种:ELF hash 采用的是  DJB (Daniel J Bernstein) hash
uint32_t dl_new_hash (const char *s)
{
        uint32_t h = 5381;

        for (unsigned char c = *s; c != '\0'; c = *++s)
                h = h * 33 + c;
        //h = ((h << 5) + h) + c
        return h;
}













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值