taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善、开源免费的CMS管理系统

一个古老的 Hash 函数

2012-04-05

hash的目的就是速度快,而且冲突低,Dobbs博士的这个hash算法代码量少,而且处理一般规模的数据都是不错的选择,著名的memcached当初抛弃了Judy后选择的就是这个hash算法了。http://burtleburtle.net/bob/hash/doobs.html

 

贴一下使用该hash的代码:

 

 

#include<stdio.h>
  #include<string.h>
 
  typedef  unsigned long  int  ub4;  
  typedef  unsigned       char ub1;  
 
 
  #define HASHPOWER  20
 
  #define hashsize(n) ((ub4)1<<(n))
  #define hashmask(n) (hashsize(n)-1)
 
  #define mix(a,b,c)
  {
    a -= b; a -= c; a ^= (c>>13);
    b -= c; b -= a; b ^= (a<<8);
    c -= a; c -= b; c ^= (b>>13);
    a -= b; a -= c; a ^= (c>>12);  
    b -= c; b -= a; b ^= (a<<16);
    c -= a; c -= b; c ^= (b>>5);
    a -= b; a -= c; a ^= (c>>3);  
    b -= c; b -= a; b ^= (a<<10);
    c -= a; c -= b; c ^= (b>>15);
  }

ub4 hash( k, length, initval)
       register ub1 *k;       
       register ub4  length;  
       register ub4  initval; 
  {
      register ub4 a,b,c,len;
 
     
      len = length;
      a = b = 0x9e3779b9; 
      c = initval;        
 
     
      while (len >= 12)
          {
              a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
              b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
              c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
              mix(a,b,c);
              k += 12; len -= 12;
          }
 
     
      c += length;

     switch(len)             
          {
          case 11: c+=((ub4)k[10]<<24);
          case 10: c+=((ub4)k[9]<<16);
          case 9 : c+=((ub4)k[8]<<8);
             
          case 8 : b+=((ub4)k[7]<<24);
          case 7 : b+=((ub4)k[6]<<16);
          case 6 : b+=((ub4)k[5]<<8);
          case 5 : b+=k[4];
          case 4 : a+=((ub4)k[3]<<24);
          case 3 : a+=((ub4)k[2]<<16);
          case 2 : a+=((ub4)k[1]<<8);
          case 1 : a+=k[0];
             
          }
      mix(a,b,c);
     
      return c;
  }
 
  int main(int argc,char **argv){
 
      ub4 hash_value;
      char *key1 = "liufuqiang";
      hash_value = hash(key1,strlen(key1),0);
      printf("%s's hash is :%lun",key1,hash_value);
      char *key2 = "liufuqiang2";
      hash_value = hash(key2,strlen(key2),0);
      printf("%s's hash is :%lun",key2,hash_value);
      return 0;
  }

 输出结果是连个无符号长整型的数字,如:

liufuqiang's hash is :8197653076439130864
liufuqiang2's hash is :13585834058072564895

类别:技术文章 | 阅读:183345 | 评论:0 | 标签:hash

想收藏或者和大家分享这篇好文章→

“一个古老的 Hash 函数”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS 3.0.2(最后更新21年03月15日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云