2011-03-30 194 views
1

假设我想阻止符合任何范围的IP地址。因此,举例来说,我想阻止IP的是在这个范围内: 207.154.0.0 - 207.154.63.255, 216.27.0.0 - 216.27.95.255, 209.59.0.0 - 209.59.31.255散列IP地址范围

我认为这是效率低下且不可行,无法在内存中存储这些范围内的所有可能的IP地址。如果我将所有范围存储在散列表中,我需要遍历所有这些范围,并查看IP是否在任何范围内,因此看起来效率低下,并且可能有超过10万个范围。

有没有办法将IP地址转换为代表范围的密钥?因此,如果我有IP 207.154.1.0和207.154.2.0,它们都映射到相同的密钥,代表范围207.154.0.0 - 207.154.63.255?

忽略阻塞IP的问题/替代解决方案......我熟悉iptable,htaccess,通配符,正则表达式等。什么是将这些IP范围存储在散列中的有效方法?

回答

2

记住,(对于IPv4)每个IP地址是一组4个8位数字,你可以简单地保持前两个数字(最左边16位)。作为简单的解决方案。

123.123.xx.yyy - > 123.123 - >这两个数字的二进制表示。这是第一个数字乘以256加上第二个数字。对于IP地址 :

// IP address is n1.n2.n3.n4 
myHash = n1*256+n2; // integer value between 0 and 65535 
+0

感谢这是有道理的。 – 2011-03-30 03:16:23

0

取决于您正在编程的语言;我会建议类似于inet_aton的东西,它会将ASCII文本IP地址转换为32位整数值。将它们存储为整数可能会更容易。

如果你不能这样做,那么使用这个伪代码。

Split IP by octect. 
For each octect 
    convert octect from ascii to integer. 
    shift bits by 4 * (octect number) and add total 
aton answer in total. 
0

你可以哈希IP地址分成若干

AAA.BBB.CCC.DDD

它翻译成类似: aaabbbcccddd

那你只需要在内存中保留一个范围:

aaabbbcccddd - eeefffggghhh

来检查IP是否被阻止,只是散列成数,并比较的范围在内存中。