Cidr4 merge algorithm #5
@@ -0,0 +1,486 @@
|
|||||||
|
4.78.139.0/24
|
||||||
|
23.101.24.0/24
|
||||||
|
23.202.231.0/24
|
||||||
|
23.217.138.0/24
|
||||||
|
23.225.141.0/24
|
||||||
|
23.234.30.0/24
|
||||||
|
31.13.64.0/24
|
||||||
|
31.13.67.0/24
|
||||||
|
31.13.68.0/22
|
||||||
|
31.13.73.0/24
|
||||||
|
31.13.75.0/24
|
||||||
|
31.13.76.0/24
|
||||||
|
31.13.80.0/21
|
||||||
|
31.13.88.0/24
|
||||||
|
31.13.90.0/23
|
||||||
|
31.13.92.0/24
|
||||||
|
31.13.94.0/23
|
||||||
|
31.13.96.0/24
|
||||||
|
31.13.106.0/24
|
||||||
|
31.13.112.0/24
|
||||||
|
37.152.2.0/24
|
||||||
|
38.121.72.0/24
|
||||||
|
39.109.122.0/24
|
||||||
|
43.226.16.0/24
|
||||||
|
43.245.104.0/24
|
||||||
|
45.54.28.0/24
|
||||||
|
45.77.186.0/24
|
||||||
|
45.114.11.0/24
|
||||||
|
45.253.131.0/24
|
||||||
|
46.61.154.0/24
|
||||||
|
46.134.216.0/24
|
||||||
|
47.88.58.0/24
|
||||||
|
49.231.55.0/24
|
||||||
|
50.23.209.0/24
|
||||||
|
50.87.93.0/24
|
||||||
|
50.117.117.0/24
|
||||||
|
52.58.1.0/24
|
||||||
|
52.175.9.0/24
|
||||||
|
54.89.135.0/24
|
||||||
|
54.144.128.0/24
|
||||||
|
54.234.18.0/24
|
||||||
|
58.63.233.0/24
|
||||||
|
59.18.44.0/24
|
||||||
|
59.18.46.0/24
|
||||||
|
59.24.3.0/24
|
||||||
|
59.188.250.0/24
|
||||||
|
61.91.8.0/24
|
||||||
|
61.205.119.0/24
|
||||||
|
62.0.80.0/24
|
||||||
|
64.13.192.0/24
|
||||||
|
64.53.242.0/24
|
||||||
|
64.233.160.0/21
|
||||||
|
64.233.168.0/22
|
||||||
|
64.233.176.0/20
|
||||||
|
65.49.26.0/24
|
||||||
|
65.49.68.0/24
|
||||||
|
66.102.1.0/24
|
||||||
|
66.220.146.0/23
|
||||||
|
66.220.148.0/23
|
||||||
|
67.15.100.0/24
|
||||||
|
67.15.129.0/24
|
||||||
|
67.228.102.0/24
|
||||||
|
67.228.235.0/24
|
||||||
|
67.230.169.0/24
|
||||||
|
69.30.25.0/24
|
||||||
|
69.50.221.0/24
|
||||||
|
69.63.176.0/24
|
||||||
|
69.63.178.0/24
|
||||||
|
69.63.180.0/23
|
||||||
|
69.63.184.0/24
|
||||||
|
69.63.186.0/23
|
||||||
|
69.63.190.0/24
|
||||||
|
69.162.134.0/24
|
||||||
|
69.171.224.0/24
|
||||||
|
69.171.227.0/24
|
||||||
|
69.171.228.0/23
|
||||||
|
69.171.234.0/24
|
||||||
|
69.171.242.0/24
|
||||||
|
69.171.247.0/24
|
||||||
|
69.197.153.0/24
|
||||||
|
74.86.3.0/24
|
||||||
|
74.86.12.0/24
|
||||||
|
74.86.17.0/24
|
||||||
|
74.86.118.0/24
|
||||||
|
74.86.142.0/24
|
||||||
|
74.86.151.0/24
|
||||||
|
74.86.226.0/24
|
||||||
|
74.86.228.0/24
|
||||||
|
74.125.1.0/24
|
||||||
|
74.125.2.0/24
|
||||||
|
74.125.8.0/24
|
||||||
|
74.125.10.0/23
|
||||||
|
74.125.13.0/24
|
||||||
|
74.125.20.0/23
|
||||||
|
74.125.23.0/24
|
||||||
|
74.125.24.0/24
|
||||||
|
74.125.26.0/24
|
||||||
|
74.125.28.0/24
|
||||||
|
74.125.31.0/24
|
||||||
|
74.125.68.0/22
|
||||||
|
74.125.90.0/24
|
||||||
|
74.125.96.0/24
|
||||||
|
74.125.100.0/24
|
||||||
|
74.125.102.0/23
|
||||||
|
74.125.104.0/24
|
||||||
|
74.125.106.0/24
|
||||||
|
74.125.110.0/23
|
||||||
|
74.125.124.0/24
|
||||||
|
74.125.126.0/23
|
||||||
|
74.125.128.0/20
|
||||||
|
74.125.153.0/24
|
||||||
|
74.125.154.0/23
|
||||||
|
74.125.159.0/24
|
||||||
|
74.125.164.0/24
|
||||||
|
74.125.170.0/24
|
||||||
|
74.125.172.0/23
|
||||||
|
74.125.192.0/23
|
||||||
|
74.125.195.0/24
|
||||||
|
74.125.196.0/22
|
||||||
|
74.125.200.0/22
|
||||||
|
74.125.204.0/23
|
||||||
|
74.125.206.0/24
|
||||||
|
75.126.33.0/24
|
||||||
|
75.126.115.0/24
|
||||||
|
75.126.124.0/24
|
||||||
|
75.126.135.0/24
|
||||||
|
75.126.150.0/24
|
||||||
|
75.126.164.0/24
|
||||||
|
77.37.252.0/24
|
||||||
|
77.120.15.0/24
|
||||||
|
80.87.199.0/24
|
||||||
|
81.23.20.0/24
|
||||||
|
81.23.23.0/24
|
||||||
|
81.192.13.0/24
|
||||||
|
81.192.191.0/24
|
||||||
|
88.191.249.0/24
|
||||||
|
90.201.124.0/24
|
||||||
|
92.87.232.0/24
|
||||||
|
93.179.102.0/24
|
||||||
|
94.24.232.0/24
|
||||||
|
94.31.189.0/24
|
||||||
|
95.59.170.0/24
|
||||||
|
96.44.137.0/24
|
||||||
|
98.159.108.0/24
|
||||||
|
103.39.76.0/24
|
||||||
|
103.42.176.0/24
|
||||||
|
103.56.16.0/24
|
||||||
|
103.73.161.0/24
|
||||||
|
103.97.3.0/24
|
||||||
|
103.97.176.0/24
|
||||||
|
103.200.30.0/23
|
||||||
|
103.214.168.0/24
|
||||||
|
103.226.246.0/24
|
||||||
|
103.228.130.0/24
|
||||||
|
103.230.123.0/24
|
||||||
|
103.240.180.0/24
|
||||||
|
103.240.182.0/24
|
||||||
|
103.246.246.0/24
|
||||||
|
103.252.114.0/23
|
||||||
|
104.16.251.0/24
|
||||||
|
104.16.252.0/24
|
||||||
|
104.23.124.0/23
|
||||||
|
104.31.142.0/24
|
||||||
|
104.244.43.0/24
|
||||||
|
104.244.45.0/24
|
||||||
|
104.244.46.0/24
|
||||||
|
107.181.166.0/24
|
||||||
|
108.160.161.0/24
|
||||||
|
108.160.162.0/23
|
||||||
|
108.160.165.0/24
|
||||||
|
108.160.166.0/23
|
||||||
|
108.160.169.0/24
|
||||||
|
108.160.170.0/24
|
||||||
|
108.160.172.0/23
|
||||||
|
108.177.8.0/21
|
||||||
|
108.177.96.0/23
|
||||||
|
108.177.98.0/24
|
||||||
|
108.177.103.0/24
|
||||||
|
108.177.104.0/24
|
||||||
|
108.177.111.0/24
|
||||||
|
108.177.112.0/24
|
||||||
|
108.177.119.0/24
|
||||||
|
108.177.120.0/22
|
||||||
|
108.177.125.0/24
|
||||||
|
108.177.126.0/23
|
||||||
|
109.224.41.0/24
|
||||||
|
110.164.8.0/24
|
||||||
|
111.243.214.0/24
|
||||||
|
113.108.239.0/24
|
||||||
|
113.171.242.0/24
|
||||||
|
114.4.7.0/24
|
||||||
|
114.43.24.0/24
|
||||||
|
115.126.100.0/24
|
||||||
|
116.89.243.0/24
|
||||||
|
118.98.30.0/24
|
||||||
|
118.98.36.0/24
|
||||||
|
118.98.106.0/24
|
||||||
|
118.107.180.0/24
|
||||||
|
118.184.26.0/24
|
||||||
|
118.184.78.0/24
|
||||||
|
118.193.202.0/24
|
||||||
|
118.193.240.0/24
|
||||||
|
119.28.87.0/24
|
||||||
|
120.232.233.0/24
|
||||||
|
120.232.234.0/24
|
||||||
|
120.233.71.0/24
|
||||||
|
120.253.250.0/24
|
||||||
|
120.253.253.0/24
|
||||||
|
120.253.255.0/24
|
||||||
|
121.78.42.0/24
|
||||||
|
122.10.85.0/24
|
||||||
|
122.154.76.0/24
|
||||||
|
122.248.226.0/24
|
||||||
|
122.252.245.0/24
|
||||||
|
124.11.210.0/24
|
||||||
|
128.121.146.0/24
|
||||||
|
128.121.243.0/24
|
||||||
|
128.242.240.0/24
|
||||||
|
128.242.245.0/24
|
||||||
|
128.242.250.0/24
|
||||||
|
130.211.15.0/24
|
||||||
|
142.250.0.0/23
|
||||||
|
142.250.4.0/24
|
||||||
|
142.250.8.0/22
|
||||||
|
142.250.12.0/23
|
||||||
|
142.250.27.0/24
|
||||||
|
142.250.28.0/24
|
||||||
|
142.250.30.0/23
|
||||||
|
142.250.64.0/20
|
||||||
|
142.250.80.0/23
|
||||||
|
142.250.96.0/21
|
||||||
|
142.250.105.0/24
|
||||||
|
142.250.107.0/24
|
||||||
|
142.250.110.0/23
|
||||||
|
142.250.112.0/22
|
||||||
|
142.250.123.0/24
|
||||||
|
142.250.125.0/24
|
||||||
|
142.250.126.0/24
|
||||||
|
142.250.128.0/24
|
||||||
|
142.250.136.0/24
|
||||||
|
142.250.138.0/24
|
||||||
|
142.250.141.0/24
|
||||||
|
142.250.142.0/24
|
||||||
|
142.250.145.0/24
|
||||||
|
142.250.147.0/24
|
||||||
|
142.250.148.0/23
|
||||||
|
142.250.150.0/24
|
||||||
|
142.250.152.0/23
|
||||||
|
142.250.157.0/24
|
||||||
|
142.250.158.0/23
|
||||||
|
142.250.176.0/20
|
||||||
|
142.250.192.0/21
|
||||||
|
142.250.200.0/23
|
||||||
|
142.250.203.0/24
|
||||||
|
142.250.204.0/22
|
||||||
|
142.250.217.0/24
|
||||||
|
142.250.218.0/23
|
||||||
|
142.251.0.0/23
|
||||||
|
142.251.2.0/24
|
||||||
|
142.251.4.0/23
|
||||||
|
142.251.6.0/24
|
||||||
|
142.251.8.0/23
|
||||||
|
142.251.10.0/24
|
||||||
|
142.251.12.0/24
|
||||||
|
142.251.15.0/24
|
||||||
|
142.251.16.0/24
|
||||||
|
142.251.18.0/24
|
||||||
|
142.251.31.0/24
|
||||||
|
142.251.32.0/22
|
||||||
|
142.251.36.0/23
|
||||||
|
142.251.39.0/24
|
||||||
|
142.251.40.0/22
|
||||||
|
142.251.45.0/24
|
||||||
|
142.251.46.0/23
|
||||||
|
142.251.107.0/24
|
||||||
|
142.251.111.0/24
|
||||||
|
142.251.112.0/24
|
||||||
|
142.251.116.0/23
|
||||||
|
142.251.120.0/24
|
||||||
|
142.251.128.0/23
|
||||||
|
142.251.130.0/24
|
||||||
|
142.251.132.0/22
|
||||||
|
142.251.140.0/22
|
||||||
|
142.251.161.0/24
|
||||||
|
142.251.162.0/23
|
||||||
|
142.251.164.0/22
|
||||||
|
142.251.168.0/24
|
||||||
|
142.251.170.0/23
|
||||||
|
142.251.172.0/22
|
||||||
|
142.251.176.0/22
|
||||||
|
142.251.180.0/24
|
||||||
|
142.251.182.0/23
|
||||||
|
142.251.184.0/22
|
||||||
|
142.251.188.0/24
|
||||||
|
142.251.208.0/23
|
||||||
|
142.251.211.0/24
|
||||||
|
142.251.214.0/23
|
||||||
|
142.251.216.0/24
|
||||||
|
142.251.218.0/24
|
||||||
|
142.251.220.0/22
|
||||||
|
145.255.14.0/24
|
||||||
|
148.163.48.0/24
|
||||||
|
150.107.3.0/24
|
||||||
|
154.0.29.0/24
|
||||||
|
154.83.14.0/23
|
||||||
|
154.85.102.0/24
|
||||||
|
154.92.16.0/24
|
||||||
|
156.233.67.0/24
|
||||||
|
157.240.0.0/22
|
||||||
|
157.240.6.0/23
|
||||||
|
157.240.8.0/22
|
||||||
|
157.240.12.0/23
|
||||||
|
157.240.15.0/24
|
||||||
|
157.240.16.0/23
|
||||||
|
157.240.18.0/24
|
||||||
|
157.240.20.0/23
|
||||||
|
159.65.107.0/24
|
||||||
|
159.106.121.0/24
|
||||||
|
159.138.20.0/24
|
||||||
|
162.125.1.0/24
|
||||||
|
162.125.2.0/24
|
||||||
|
162.125.6.0/23
|
||||||
|
162.125.8.0/24
|
||||||
|
162.125.17.0/24
|
||||||
|
162.125.18.0/24
|
||||||
|
162.125.32.0/24
|
||||||
|
162.125.34.0/24
|
||||||
|
162.125.80.0/24
|
||||||
|
162.125.82.0/23
|
||||||
|
162.220.12.0/24
|
||||||
|
168.143.162.0/24
|
||||||
|
168.143.171.0/24
|
||||||
|
172.217.0.0/19
|
||||||
|
172.217.129.0/24
|
||||||
|
172.217.130.0/24
|
||||||
|
172.217.133.0/24
|
||||||
|
172.217.135.0/24
|
||||||
|
172.217.160.0/20
|
||||||
|
172.217.192.0/22
|
||||||
|
172.217.197.0/24
|
||||||
|
172.217.203.0/24
|
||||||
|
172.217.204.0/24
|
||||||
|
172.217.212.0/24
|
||||||
|
172.217.214.0/23
|
||||||
|
172.217.218.0/23
|
||||||
|
172.217.222.0/24
|
||||||
|
172.253.58.0/24
|
||||||
|
172.253.62.0/23
|
||||||
|
172.253.112.0/21
|
||||||
|
172.253.120.0/24
|
||||||
|
172.253.122.0/23
|
||||||
|
172.253.124.0/22
|
||||||
|
173.194.4.0/23
|
||||||
|
173.194.12.0/24
|
||||||
|
173.194.22.0/24
|
||||||
|
173.194.28.0/23
|
||||||
|
173.194.31.0/24
|
||||||
|
173.194.49.0/24
|
||||||
|
173.194.51.0/24
|
||||||
|
173.194.54.0/23
|
||||||
|
173.194.59.0/24
|
||||||
|
173.194.65.0/24
|
||||||
|
173.194.66.0/23
|
||||||
|
173.194.68.0/23
|
||||||
|
173.194.70.0/24
|
||||||
|
173.194.73.0/24
|
||||||
|
173.194.74.0/24
|
||||||
|
173.194.76.0/22
|
||||||
|
173.194.135.0/24
|
||||||
|
173.194.150.0/24
|
||||||
|
173.194.154.0/24
|
||||||
|
173.194.161.0/24
|
||||||
|
173.194.162.0/23
|
||||||
|
173.194.164.0/24
|
||||||
|
173.194.166.0/23
|
||||||
|
173.194.174.0/23
|
||||||
|
173.194.178.0/24
|
||||||
|
173.194.182.0/23
|
||||||
|
173.194.184.0/23
|
||||||
|
173.194.187.0/24
|
||||||
|
173.194.188.0/24
|
||||||
|
173.194.190.0/23
|
||||||
|
173.194.192.0/19
|
||||||
|
173.208.182.0/24
|
||||||
|
173.231.12.0/24
|
||||||
|
173.234.53.0/24
|
||||||
|
173.236.182.0/24
|
||||||
|
173.236.212.0/24
|
||||||
|
173.244.209.0/24
|
||||||
|
173.244.217.0/24
|
||||||
|
173.252.88.0/24
|
||||||
|
173.252.105.0/24
|
||||||
|
173.252.108.0/24
|
||||||
|
173.252.248.0/24
|
||||||
|
173.255.209.0/24
|
||||||
|
173.255.213.0/24
|
||||||
|
174.36.196.0/24
|
||||||
|
174.36.228.0/24
|
||||||
|
174.37.54.0/24
|
||||||
|
174.37.154.0/24
|
||||||
|
174.37.175.0/24
|
||||||
|
174.37.243.0/24
|
||||||
|
178.151.230.0/24
|
||||||
|
178.176.156.0/24
|
||||||
|
179.60.193.0/24
|
||||||
|
180.163.150.0/23
|
||||||
|
182.50.139.0/24
|
||||||
|
182.79.251.0/24
|
||||||
|
184.72.1.0/24
|
||||||
|
184.173.136.0/24
|
||||||
|
185.45.6.0/23
|
||||||
|
185.60.216.0/24
|
||||||
|
185.60.218.0/23
|
||||||
|
185.158.208.0/24
|
||||||
|
186.208.210.0/24
|
||||||
|
187.7.116.0/24
|
||||||
|
190.5.235.0/24
|
||||||
|
192.133.77.0/24
|
||||||
|
192.178.24.0/23
|
||||||
|
192.178.27.0/24
|
||||||
|
192.178.48.0/23
|
||||||
|
192.178.50.0/24
|
||||||
|
192.178.52.0/24
|
||||||
|
192.178.54.0/24
|
||||||
|
192.178.56.0/23
|
||||||
|
192.178.128.0/24
|
||||||
|
192.178.130.0/24
|
||||||
|
193.109.164.0/24
|
||||||
|
194.78.0.0/24
|
||||||
|
196.49.8.0/24
|
||||||
|
198.27.124.0/24
|
||||||
|
198.44.185.0/24
|
||||||
|
199.16.156.0/24
|
||||||
|
199.16.158.0/24
|
||||||
|
199.59.148.0/23
|
||||||
|
199.59.150.0/24
|
||||||
|
199.96.58.0/23
|
||||||
|
199.96.61.0/24
|
||||||
|
199.96.62.0/23
|
||||||
|
199.193.116.0/24
|
||||||
|
201.0.223.0/24
|
||||||
|
202.53.137.0/24
|
||||||
|
202.160.128.0/23
|
||||||
|
202.160.130.0/24
|
||||||
|
202.169.173.0/24
|
||||||
|
202.182.98.0/24
|
||||||
|
203.66.182.0/24
|
||||||
|
203.111.254.0/24
|
||||||
|
203.113.51.0/24
|
||||||
|
203.113.189.0/24
|
||||||
|
203.208.39.0/24
|
||||||
|
203.208.40.0/23
|
||||||
|
203.208.43.0/24
|
||||||
|
203.208.49.0/24
|
||||||
|
203.208.50.0/24
|
||||||
|
203.233.96.0/24
|
||||||
|
204.79.197.0/24
|
||||||
|
205.186.152.0/24
|
||||||
|
208.31.254.0/24
|
||||||
|
208.43.170.0/24
|
||||||
|
208.43.237.0/24
|
||||||
|
208.77.47.0/24
|
||||||
|
208.101.21.0/24
|
||||||
|
208.101.60.0/24
|
||||||
|
209.85.144.0/22
|
||||||
|
209.85.165.0/24
|
||||||
|
209.85.200.0/22
|
||||||
|
209.85.224.0/24
|
||||||
|
209.85.226.0/24
|
||||||
|
209.85.232.0/22
|
||||||
|
209.95.56.0/24
|
||||||
|
210.56.51.0/24
|
||||||
|
210.139.253.0/24
|
||||||
|
210.209.84.0/24
|
||||||
|
211.104.160.0/24
|
||||||
|
212.113.52.0/24
|
||||||
|
213.59.210.0/24
|
||||||
|
216.58.192.0/20
|
||||||
|
216.58.208.0/21
|
||||||
|
216.58.217.0/24
|
||||||
|
216.58.220.0/22
|
||||||
|
216.239.32.0/24
|
||||||
|
216.239.34.0/24
|
||||||
|
216.239.36.0/24
|
||||||
|
216.239.38.0/24
|
||||||
|
220.181.174.0/24
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
from copy import deepcopy
|
||||||
|
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from netaddr import IPNetwork, cidr_merge
|
||||||
|
|
||||||
|
|
||||||
|
def get_ips(input_file) -> List[IPNetwork]:
|
||||||
|
with open(input_file, "r") as file:
|
||||||
|
data = file.read().splitlines()
|
||||||
|
return [IPNetwork(line) for line in data]
|
||||||
|
|
||||||
|
|
||||||
|
def reduce_prefixlen(ip: IPNetwork, step=1) -> IPNetwork:
|
||||||
|
"""Reduce the CIDR prefix len by step"""
|
||||||
|
new_ip = IPNetwork(ip)
|
||||||
|
new_ip.prefixlen -= step
|
||||||
|
return IPNetwork(new_ip.cidr)
|
||||||
|
|
||||||
|
|
||||||
|
def merge_ips(ips_to_reduce: List[IPNetwork], max_len, step=1) -> List[IPNetwork]:
|
||||||
|
ips = deepcopy(ips_to_reduce)
|
||||||
|
reduction_limit_reached = False
|
||||||
|
while len(ips) > max_len and not reduction_limit_reached:
|
||||||
|
reduced_ips = map(reduce_prefixlen, ips)
|
||||||
|
merged_ips = cidr_merge(reduced_ips)
|
||||||
|
if len(merged_ips) > 1:
|
||||||
|
ips = merged_ips
|
||||||
|
else:
|
||||||
|
reduction_limit_reached = True
|
||||||
|
print("The reduction limit has been reached")
|
||||||
|
return ips
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
file = "cidr4.txt"
|
||||||
|
ips = get_ips(file)
|
||||||
|
print(f"{len(ips)=}")
|
||||||
|
merged_ips = merge_ips(ips, 10)
|
||||||
|
print(f"{len(merged_ips)=}")
|
||||||
|
print(", ".join([str(x) for x in merged_ips]))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
assert reduce_prefixlen(IPNetwork("4.78.139.0/24")) == IPNetwork("4.78.138.0/23")
|
||||||
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user
Здесь за один проход объединяются все возможные объединения, таким образом мы можем промахнуться мимо цели в
Mэлементов списка.Здесь не хватает возвращения количества адресов, "попавших под раздачу": не принадлежащих начальному списку, но попавших в результат из-за объединения. Это количество позволит найти оптимальное решение.
Я думаю, использование внешней библиотеки (и вообще любой библиотеки) размывает смысл алгоритма: хотя из следующих строк понятно, что будет сделано; однако не очевидно, как это будет сделано, и будет ли оптимальный ответ, и будет ли оптимальное решение (что не обязательно).
Мне кажется, что функция
merge_nodesсодержит не все свои обязанности, некоторые из них похоже вложись в функциюreduce_nodes. Стоит их переместить.Алгоритм слишком много делает каждый шаг, из-за этого работает медленно. Как мне кажется, для оптимизации стоит разработать алгоритм начиная с рекурсии, возможно их будет штук 5 связанных, зато это позволит определить характеристики отдельных кусков и принять решение по оптимизации.
Пора перенести тесты в отдельный файл?