Algorithm 如何为给定国家/地区生成随机IPv4号码?
如果给定的国家有IPv4地址范围,如何生成随机地址?例如,新加坡的单个电流范围集(多个范围之一)为:Algorithm 如何为给定国家/地区生成随机IPv4号码?,algorithm,ip-address,ipv4,Algorithm,Ip Address,Ipv4,如果给定的国家有IPv4地址范围,如何生成随机地址?例如,新加坡的单个电流范围集(多个范围之一)为: +----------+----------+--------------+ | ip_from | ip_to | country_code | +----------+----------+--------------+ | 18925568 | 18926079 | SG | +----------+----------+--------------+ 说明
+----------+----------+--------------+
| ip_from | ip_to | country_code |
+----------+----------+--------------+
| 18925568 | 18926079 | SG |
+----------+----------+--------------+
说明
IP_Number = 16777216*w + 65536*x + 256*y + z
在哪里
IP\u编号
代表IP\u from
或IP\u to
。对于上面介绍的新加坡系列,它给了我:
16777216*w + 65536*x + 256*y + z >= 18925568; // from
16777216*w + 65536*x + 256*y + z <= 18926079; // to
16777216*w+65536*x+256*y+z>=18925568;//从…起
16777216*w+65536*x+256*y+z这里是一个可测试的实现(在JavaScript中,因为它可以直接在这里运行)和一点说明
首先,您需要从指定的范围生成随机数。如果您有一个函数(我们称之为random
)可以生成0到0.999之间的随机实数<代码>[0,1)
然后您可以执行此操作
num = (random() * (end - start + 1)) + start
然后,您需要使用mod 256
4次将数字拆分为4个部分,并且对给定的数字使用div 256
3次(第四次div
操作将是不必要的,但如果我们在循环中进行,那么为了简单起见,我们可以将其保留在那里,因为它不会改变任何东西)
然后,您可以将它们放入一个数组[fourth,third,second,first]
(注意这里的顺序)并进行一些验证-一些地址是为私有Internet保留的,因此如果您碰巧生成了其中一个地址,只需将其丢弃并生成一个新的地址(您可以在这里循环或递归,直到生成一个有效的地址)
根据RFC 1918,保留这些范围内的Ip地址:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
这里是实现
const start=18925568;
const end=18926079;
函数_generateRandomIp(开始、结束){
设r=Math.floor(Math.random()*(end-start+1))+start;
常数ip=[];
for(设i=0;i<4;i++){
ip.push(r%256);
r=数学楼层(r/256);
}
返回ip.reverse();//将结果mod/div按正确顺序排列
}
函数生成器域(开始、结束){
设ip=_generateRandomIp(开始,结束);
让valid=true;
//ip的格式不能为10.xxx.xxx.xxx
如果(ip[0]==10){valid=false;}
//ip的格式不能为172.16.xxx.xxx
如果(ip[0]==172&&ip[1]==16){valid=false;}
//ip的格式不能为192.168.xxx.xxx
如果(ip[0]==192&&ip[1]==168){valid=false;}
如果(有效===true){
返回ip.join('.');//将ip转换为字符串格式
}否则{
return generateRandomIp(开始,结束);//再试一次
}
}
const ip=生成器域(开始、结束);
console.log(ip);
在范围内生成一个随机数,然后重复div/mod by 256.div/mod by 256,然后验证ip(不应结束于0或255)。ip地址不按国家分配。
(% - modulo, // - div)
first = num % 256
num = num // 256
second = num % 256
num = num // 256
third = num % 256
num = num // 256
fourth = num % 256
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)