免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2070 | 回复: 1
打印 上一主题 下一主题

[算法] 请教Netfilter hash算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-23 12:48 |只看该作者 |倒序浏览
Netfilter的连接跟踪表,是通过一个hash表来维护的,其首先把一个数据包根据来源/端口/协议转换成一个"tuple",然后根据这个"tuple"来计算hash值:
  1. static u_int32_t
  2. hash_conntrack(const struct ip_conntrack_tuple *tuple)
  3. {
  4. #if 0
  5.         dump_tuple(tuple);
  6. #endif
  7.         return (jhash_3words(tuple->src.ip,
  8.                              (tuple->dst.ip ^ tuple->dst.protonum),
  9.                              (tuple->src.u.all | (tuple->dst.u.all << 16)),
  10.                              ip_conntrack_hash_rnd) % ip_conntrack_htable_size);
  11. }
复制代码


其中ip_conntrack_hash_rnd是一个通过get_random_bytes函数产生的四字节的随机数,ip_conntrack_htable_size是hash表的大小。

  1. static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)
  2. {
  3.         a += JHASH_GOLDEN_RATIO;
  4.         b += JHASH_GOLDEN_RATIO;
  5.         c += initval;

  6.         __jhash_mix(a, b, c);

  7.         return c;
  8. }
复制代码


__jhash_mix宏定义如下:

  1. /* NOTE: Arguments are modified. */
  2. #define __jhash_mix(a, b, c) \
  3. { \
  4.   a -= b; a -= c; a ^= (c>>13); \
  5.   b -= c; b -= a; b ^= (a<<8); \
  6.   c -= a; c -= b; c ^= (b>>13); \
  7.   a -= b; a -= c; a ^= (c>>12);  \
  8.   b -= c; b -= a; b ^= (a<<16); \
  9.   c -= a; c -= b; c ^= (b>>5); \
  10.   a -= b; a -= c; a ^= (c>>3);  \
  11.   b -= c; b -= a; b ^= (a<<10); \
  12.   c -= a; c -= b; c ^= (b>>15); \
  13. }
复制代码


宏JHASH_GOLDEN_RATIO 定义如下:

  1. /* The golden ration: an arbitrary value */
  2. #define JHASH_GOLDEN_RATIO        0x9e3779b9
复制代码


这个hash算法看了个半懂,请哪位大哥分析一下这个算法,说说这样设计的好处,呵呵!!

论坛徽章:
0
2 [报告]
发表于 2006-07-23 15:34 |只看该作者
这个算法基于Bob Jenkins早期的一篇论文,代码原封不动照搬。
为什么这么写,是有数学道理的,不是两句讲的清。
去年作者又发现了一个据他说更快的算法,是这样的:

  1. #define rot(x,k) (((x)<<(k)) ^ ((x)>>(32-(k))))

  2. #define hash_mix(a,b,c) \
  3. { \
  4.   c ^= b; c -= rot(b,14); \
  5.   a ^= c; a -= rot(c,11); \
  6.   b ^= a; b -= rot(a,25); \
  7.   c ^= b; c -= rot(b,16); \
  8.   a ^= c; a -= rot(c,4);  \
  9.   b ^= a; b -= rot(a,14); \
  10.   c ^= b; c -= rot(b,24); \
  11. }
复制代码


也许过一段时间核心就会改成这个代码了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP