javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3352回复:14

针对ip地址的匹配查找算法

楼主#
更多 发布于:2002-11-21 16:23
我在ndis中要做一个有关ip地址的匹配查找算法。

我不知道是应该把ip地址看成一个32位的二进制数,然后每位去比较还是应该把ip地址看成4个十进制数,一般都是用什么方法?

望能指点一二
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-21 16:38
当然是看作二进制数效率高。不用每位比,直接当作整数操作即可
注意一定要转换为host address才能进行大小的比较。
你可以用hash function, red-black tree等算法来加速查找。

如果是network address则不能进行比较。这时字节序是乱的。
 :)
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-21 16:47
老兄你的意思是不是10进制数效率高。
但我还有个问题不明白。
计算机是怎么处理两个数的比较的
是不是把他们转换成二进制的数再比较。

比如说:
计算机判断1=1的时间和判断1000000=100000的时间是否相同?
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-21 16:59
数值在计算机内总是以二进制形式存在、参加运算的。
系统不用作专门的转换。
因此作两种判断的时间是相同的。

效率的差异是在所进行的运算上。比如&,|,<<,>>的速度要比+,-快。
*,/更慢。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-21 17:13
再问一下,
如果我除了ip地址,后面还要带上端口号,一起进行比较,那是否可以把他们联合起来整个作为一个长整形进行比较,这样会影响效率吗?
比如说:202。112。147。2:8080
是否可以改成一个长整形 20211214728080 当成关键字参与比较。
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-21 17:24
我都要晕倒了。;)
你难道不用inet_aton()把ip地址转为int吗?

你这么做当然效率很低了。数据报中的ip地址可是以32bit 整数的形式存在的,你要每次把地址转化为2021121472的形式要做多少运算牙?
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-21 17:31
不好意思,高手,小弟资质驽钝,还要多多指点。

那针对ip和端口号共同转换成一个书可如何是好
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-21 17:32
有点没看清楚你的问题。
总结一下:
应该把ip地址看成一个32位的二进制数,我觉得这样效率高。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-21 17:39
老兄,为什么转换成二进制效率高,难道计算机判断两个二进制不是用每位比较的方法吗?那它是用什么方法呢?
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-21 17:40
如果非要拼在一起的话,也不是没有办法。
ip addr: 32 bit
port   : 16 bit
这样可以用一个long long(64bit)来存储二者,就是有点浪费空间。

unsigned long long together = ipaddr;
together << 16;
together += port;
这样together中就是二者品在一起了。

together高16位没有用,中间是ipaddr,低16位是port.
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-21 17:46
茅塞顿开,
老兄只剩下一个问题了,再麻烦帮解答一下

为什么转换成二进制效率高,难道计算机判断两个二进制不是用每位比较的方法吗?那它是用什么方法呢?
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-21 17:48
小弟无以为报,只好以分数报答。
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-21 17:48
是每位都要比较,但是只用一条指令在一个时钟周期内就完成了。
是在cpu内部用硬件实现的,效率很高。
ncspirit
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-21 17:53
别客气。你问的挺本质的。;)
建议看看“计算机原理”之类的书。
javayw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-21 18:01
谢谢,有问题还要请教
只怪当初不好好学习,现在是老大徒伤辈啊!
游客

返回顶部