免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

[算法] 发布我的开源cache库ccache [复制链接]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
21 [报告]
发表于 2008-04-03 09:06 |只看该作者
  1. unsigned int hash(const void* key, ccache_t* cache)

  2. {

  3. #define mix(a,b,c) \

  4.     { \

  5.         a -= b; a -= c; a ^= (c >> 13); \

  6.         b -= c; b -= a; b ^= (a << 8); \

  7.         c -= a; c -= b; c ^= (b >> 13); \

  8.         a -= b; a -= c; a ^= (c >> 12);  \

  9.         b -= c; b -= a; b ^= (a << 16); \

  10.         c -= a; c -= b; c ^= (b >> 5); \

  11.         a -= b; a -= c; a ^= (c >> 3);  \

  12.         b -= c; b -= a; b ^= (a << 10); \

  13.         c -= a; c -= b; c ^= (b >> 15); \

  14.     }



  15.     char *k = (char *)key;

  16.     unsigned int a, b, c, i, len;

  17.     unsigned int length = cache->keysize;



  18.     for (i = 0; i < length; i++)

  19.         k[i] = tolower(k[i]);



  20.     len = length;

  21.     a = b = c = 0x9e3779b9;  /* the golden ratio; an arbitrary value */



  22.     while (12 <= len)

  23.     {

  24.         a += (k[0] +((unsigned int)k[1] << 8) +((unsigned int)k[2] << 16) +((unsigned int)k[3] << 24));

  25.         b += (k[4] +((unsigned int)k[5] << 8) +((unsigned int)k[6] << 16) +((unsigned int)k[7] << 24));

  26.         c += (k[8] +((unsigned int)k[9] << 8) +((unsigned int)k[10]<< 16)+((unsigned int)k[11] << 24));

  27.         mix(a,b,c);

  28.         k += 12;

  29.         len -= 12;

  30.     }



  31.     c += length;

  32.     switch(len)

  33.     {

  34.         case 11: c+=((unsigned int)k[10] << 24);

  35.         case 10: c+=((unsigned int)k[9]  << 16);

  36.         case 9 : c+=((unsigned int)k[8]  << 8);

  37.         case 8 : b+=((unsigned int)k[7] << 24);

  38.         case 7 : b+=((unsigned int)k[6] << 16);

  39.         case 6 : b+=((unsigned int)k[5] << 8);

  40.         case 5 : b+=k[4];

  41.         case 4 : a+=((unsigned int)k[3] << 24);

  42.         case 3 : a+=((unsigned int)k[2] << 16);

  43.         case 2 : a+=((unsigned int)k[1] << 8);

  44.         case 1 : a+=k[0];

  45.     }

  46.     mix(a,b,c);



  47.     return c % cache->hashitemnum;

  48. }
复制代码

这段代码看不懂啊。。版主能粗略的讲解一下么?
是寻找节点所在的hash表的索引吗?

论坛徽章:
0
22 [报告]
发表于 2008-04-03 09:30 |只看该作者

回复 #21 yangsf5 的帖子

你的理解是对的.

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
23 [报告]
发表于 2008-04-03 09:59 |只看该作者
哈哈,关于本函数用途的理解是因为你代码里有上下逻辑。。。

但是,你的这个算法我看不懂阿,晕糊糊的。。

我是个unix编程初学者,要是版主能有时间详讲一下这段代码,那该多好阿。。


晕的我都不知道为啥要建多个哈希表了。。

论坛徽章:
0
24 [报告]
发表于 2008-04-03 10:51 |只看该作者

回复 #23 yangsf5 的帖子

这个hash算法我也不懂,抄的,能用就是.
一个好的hash算法有一个标准,就是要求hash出来的index能够尽可能的平均分布.

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
25 [报告]
发表于 2008-04-03 11:16 |只看该作者
还没明白的地方:
这个cache里,可以有多张哈希表。。
建多张表的用意是:可以多张表并行的处理同时要求处理的太多的结点吗?

如果是这样,那个算法是否处理了同个结点的位置唯一性?

论坛徽章:
0
26 [报告]
发表于 2008-04-03 15:35 |只看该作者

从开始构想到公司成立到会计服务。。。您想过一站式服务吗?

拥有我们,这一切就不再是梦想!
汉唐咨询就是伴随您的企业从成立到发展的合作好伙伴!
选择汉唐,选择品牌服务!

联系方式:010-84466445   或   010-64611785转612    王小姐
OICQ: 648680710                MSN:wyp_zhuce@hotmail.com
公司网站:http://www.zhucestar.com/

论坛徽章:
0
27 [报告]
发表于 2008-04-03 17:13 |只看该作者
*** 作者被禁止或删除 内容自动屏蔽 ***

论坛徽章:
0
28 [报告]
发表于 2008-04-03 21:00 |只看该作者

楼主的精神可佳, 支持。

建议参考一下开源的数据库berkeley db.  感觉你的思路跟berkeley db很像, 从中可以参考和借鉴一下。

预祝你的数据库越来越完善!

论坛徽章:
0
29 [报告]
发表于 2008-04-04 03:54 |只看该作者
不错。哈哈。。谁共享下。。块内存管理,链接管理的代码出来。。谢谢。

论坛徽章:
0
30 [报告]
发表于 2008-04-04 04:01 |只看该作者
看了下代码。哈。。

发现你也喜欢用自动生成API参考。。是doxgen吗。。。

到此下载:http://webscripts.softpedia.com/ ... /Doxygen-15198.html

[ 本帖最后由 mantiser 于 2008-4-4 04:11 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP