2011-03-30 191 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是否被阻止,只是散列成數,並比較的範圍在內存中。