阅读:3352回复:14
针对ip地址的匹配查找算法
我在ndis中要做一个有关ip地址的匹配查找算法。
我不知道是应该把ip地址看成一个32位的二进制数,然后每位去比较还是应该把ip地址看成4个十进制数,一般都是用什么方法? 望能指点一二 |
|
沙发#
发布于:2002-11-21 16:38
当然是看作二进制数效率高。不用每位比,直接当作整数操作即可
注意一定要转换为host address才能进行大小的比较。 你可以用hash function, red-black tree等算法来加速查找。 如果是network address则不能进行比较。这时字节序是乱的。 :) |
|
板凳#
发布于:2002-11-21 16:47
老兄你的意思是不是10进制数效率高。
但我还有个问题不明白。 计算机是怎么处理两个数的比较的 是不是把他们转换成二进制的数再比较。 比如说: 计算机判断1=1的时间和判断1000000=100000的时间是否相同? |
|
地板#
发布于:2002-11-21 16:59
数值在计算机内总是以二进制形式存在、参加运算的。
系统不用作专门的转换。 因此作两种判断的时间是相同的。 效率的差异是在所进行的运算上。比如&,|,<<,>>的速度要比+,-快。 *,/更慢。 |
|
地下室#
发布于:2002-11-21 17:13
再问一下,
如果我除了ip地址,后面还要带上端口号,一起进行比较,那是否可以把他们联合起来整个作为一个长整形进行比较,这样会影响效率吗? 比如说:202。112。147。2:8080 是否可以改成一个长整形 20211214728080 当成关键字参与比较。 |
|
5楼#
发布于:2002-11-21 17:24
我都要晕倒了。;)
你难道不用inet_aton()把ip地址转为int吗? 你这么做当然效率很低了。数据报中的ip地址可是以32bit 整数的形式存在的,你要每次把地址转化为2021121472的形式要做多少运算牙? |
|
6楼#
发布于:2002-11-21 17:31
不好意思,高手,小弟资质驽钝,还要多多指点。
那针对ip和端口号共同转换成一个书可如何是好 |
|
7楼#
发布于:2002-11-21 17:32
有点没看清楚你的问题。
总结一下: 应该把ip地址看成一个32位的二进制数,我觉得这样效率高。 |
|
8楼#
发布于:2002-11-21 17:39
老兄,为什么转换成二进制效率高,难道计算机判断两个二进制不是用每位比较的方法吗?那它是用什么方法呢?
|
|
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. |
|
10楼#
发布于:2002-11-21 17:46
茅塞顿开,
老兄只剩下一个问题了,再麻烦帮解答一下 为什么转换成二进制效率高,难道计算机判断两个二进制不是用每位比较的方法吗?那它是用什么方法呢? |
|
11楼#
发布于:2002-11-21 17:48
小弟无以为报,只好以分数报答。
|
|
12楼#
发布于:2002-11-21 17:48
是每位都要比较,但是只用一条指令在一个时钟周期内就完成了。
是在cpu内部用硬件实现的,效率很高。 |
|
13楼#
发布于:2002-11-21 17:53
别客气。你问的挺本质的。;)
建议看看“计算机原理”之类的书。 |
|
14楼#
发布于:2002-11-21 18:01
谢谢,有问题还要请教
只怪当初不好好学习,现在是老大徒伤辈啊! |
|