哈希IP地址范围

时间:2011-03-30 02:39:16

标签: memory hash

假设我想阻止适合一组范围中任何范围的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是否在任何范围内,因此效率似乎低,并且可能有超过100,000个范围。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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.

答案 2 :(得分:0)

你可以将ip地址哈希到一个数字: 对于IP地址:

  

一个aaa.bbb.ccc.ddd

将其翻译成以下内容:     aaabbbcccddd

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

  

aaabbbcccddd - eeefffggghhh

检查ip是否被阻止,只是将其哈希为数字并与内存中的范围进行比较。