对字符串进行哈希的算法,hash_func

最近做了一个Dns日志解析的项目,需要对字符串进行大量查找,对效率要求比较高,所以在网上找了很多关于哈希的资料,

在网上找了一个算法如下:

 inline static unsigned int hash_func(char *str, int len)
 {
  register unsigned int sum = 0; 
  register unsigned int h = 0;
  register unsigned short *p = (unsigned short *)str;
  register unsigned short *s = (unsigned short *)str;
 
  while(p - s < len) 
  {
  register unsigned short a = *(p++) * (p-s);
  sum += sum ^ a; 
  h += a;
 
  printf("a = %u\n",a);
  }
 
  return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
 }

上面这个算法看上去好像是没什么问题,其实这个算法是有问题的,我测试发现,对同一个字符串比如 "OtherCityimg02.taobaocdn.com" 每次哈希的结果不一定一样,

主要是   register unsigned short *p = (unsigned short *)str;
          register unsigned short *s = (unsigned short *)str;  

导致的,这样p++一次其实是跳了两个字符,所以我做了如下改进:

inline static unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0; 
register unsigned int h = 0;
register unsigned char *p = (unsigned char *)str;
register unsigned char *s = (unsigned char *)str;


while(p - s < len) 
{
register unsigned char c = (*(p++));
register unsigned int d = (p-s);
register unsigned int a = ( c * d);
sum += sum ^ a; 
h += a;
}


return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
}

现在每次对同一个字符串哈希结果都是一样的了。好,收工!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值