免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
1 [报告]
发表于 2008-04-01 11:04 |显示全部楼层
下不动啊。。资源是 0/1。。

版主的博客在哪啊,想拜读。

另外能把你的cache发给我一份么?感激

[ 本帖最后由 yangsf5 于 2009-1-5 13:03 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
2 [报告]
发表于 2008-04-01 11:19 |显示全部楼层
挂迅雷挂了20分钟。。。终于下来了。。。

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
3 [报告]
发表于 2008-04-02 20:19 |显示全部楼层
  1.     while (0 <= index)

  2.     {

  3.         node = NODE(cache, index);

  4.         nodekey = NODE_KEY(node);



  5.         if (!cmp(key, nodekey))

  6.         {

  7.             break;

  8.         }



  9.         index = node->next;

  10.     }
复制代码

版主的这个找节点是用遍历链表的阿?
我要维护一个1.5w节点的cache,这样会降低效率么?

如果设计成哈希表那样的,可以直接由数据的key找到对应节点的。。。但又会解决哈希冲突的开销和映射。。。

两种效率怎么取舍阿?

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
4 [报告]
发表于 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表的索引吗?

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

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

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


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

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

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

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
7 [报告]
发表于 2008-04-04 13:10 |显示全部楼层
原帖由 yangsf5 于 2008-4-3 11:16 发表
还没明白的地方:
这个cache里,可以有多张哈希表。。
建多张表的用意是:可以多张表并行的处理同时要求处理的太多的结点吗?

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



都那么强,就没人回答我的问题吗?

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
8 [报告]
发表于 2008-04-11 21:51 |显示全部楼层

  1. int find_data(const void* key, void* data, ccache_t* cache, cmpfun cmp)
  2. {
  3.     int hashindex = hash(key, cache), ret;
  4.     void *nodedata;
  5.     node_t *node;

  6.     if (0 > lock(&(cache->mutex)))
  7.     {
  8.         return -1;
  9.     }

  10.     ret = FIND_NODE(hashindex, key, cache, cmp);

  11.     if (0 <= ret)
  12.     {
  13.         if (NULL != data)
  14.         {
  15.             node = NODE(cache, ret);
  16.             nodedata = NODE_DATA(node);
  17.             memcpy(data, nodedata, node->datasize);
  18.         }
  19.         linktolrulisthead(ret, cache);
  20.     }

  21.     if (0 > unlock(&(cache->mutex)) || 0 > ret)
  22.     {
  23.         return -1;
  24.     }
  25.     return ret;
  26. }
复制代码

搂住这个函数有问题。。。
在调用这个函数时,对返回值进行判断。
>=0...说明节点存在。。
但是对于-1,就不能确定了:
可以是还没判断就因为锁出错返回-1;也可以是没有这个节点返回-1(因为链表里的最后一个节点的next是-1)。
(算了,不愿回答就算了。。。)

  1. int list_findnode(int hashindex, const void* key, ccache_t* cache, cmpfun cmp)
  2. {
  3.     hashitem_t *hashitem = HASH_ITEM(cache, hashindex);
  4.     int index = hashitem->first;
  5.     node_t *node;
  6.     void* nodekey;

  7.     while (0 <= index)
  8.     {
  9.         node = NODE(cache, index);
  10.         nodekey = NODE_KEY(node);
  11.         if (!cmp(key, nodekey))
  12.         {
  13.             break;
  14.         }

  15.         index = node->next;
  16.     }

  17.     return index;
  18. }
复制代码

[ 本帖最后由 yangsf5 于 2009-1-5 13:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP