Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何为给定国家/地区生成随机IPv4号码?_Algorithm_Ip Address_Ipv4 - Fatal编程技术网

Algorithm 如何为给定国家/地区生成随机IPv4号码?

Algorithm 如何为给定国家/地区生成随机IPv4号码?,algorithm,ip-address,ipv4,Algorithm,Ip Address,Ipv4,如果给定的国家有IPv4地址范围,如何生成随机地址?例如,新加坡的单个电流范围集(多个范围之一)为: +----------+----------+--------------+ | ip_from | ip_to | country_code | +----------+----------+--------------+ | 18925568 | 18926079 | SG | +----------+----------+--------------+ 说明

如果给定的国家有IPv4地址范围,如何生成随机地址?例如,新加坡的单个电流范围集(多个范围之一)为:

+----------+----------+--------------+
| 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)