如何为给定国家/地区生成随机 IPv4 号码?
How to generate random IPv4 number for a given country?
有了给定国家/地区的 IPv4 地址范围,如何生成随机地址?例如,新加坡的一组当前范围(许多范围之一)是:
+----------+----------+--------------+
| ip_from | ip_to | country_code |
+----------+----------+--------------+
| 18925568 | 18926079 | SG |
+----------+----------+--------------+
FAQ(3) 解释说
IP_Number = 16777216*w + 65536*x + 256*y + z
哪里
IP_Address = w.x.y.z
IP_Number
代表 ip_from
或 ip_to
。对于上面介绍的新加坡范围,它给了我:
16777216*w + 65536*x + 256*y + z >= 18925568; // from
16777216*w + 65536*x + 256*y + z <= 18926079; // to
如何生成随机 w
、x
、y
和 z
?
这是一个可测试的实现(在 JavaScript 中,因为可以直接在此处 运行)和一些描述。
首先您需要从指定范围内生成随机数。如果你有一个函数(我们称之为 random
)生成 0 到 0.999 之间的随机实数... [0,1)
那么你可以这样做。
num = (random() * (end - start + 1)) + start
然后你需要使用mod 256
4次将数字分成4个部分,并对给定的数字使用div 256
3次(第四次div
操作是不必要的但如果我们在循环中进行,那么为了简单起见,我们可以将它保留在那里,因为它不会改变任何东西)。
(% - modulo, // - div)
first = num % 256
num = num // 256
second = num % 256
num = num // 256
third = num % 256
num = num // 256
fourth = num % 256
然后您可以将它们推入数组 [fourth, third, second, first]
(注意此处的 order)并进行一些验证 - 有些地址是为私人互联网保留的,所以如果您碰巧要生成其中一个,只需将其丢弃并生成一个新的(您可以在此处循环或递归,直到生成一个有效的)。
这些范围内的 IP 地址根据 RFC 1918 保留:
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;
function _generateRandomIp(start, end) {
let r = Math.floor(Math.random() * (end - start + 1)) + start;
const ip = [];
for (let i = 0; i < 4; i++) {
ip.push(r % 256);
r = Math.floor(r / 256);
}
return ip.reverse(); // put the results mod/div into correct order
}
function generateRandomIp(start, end) {
let ip = _generateRandomIp(start, end);
let valid = true;
// ip can't be of format 10.xxx.xxx.xxx
if (ip[0] === 10) { valid = false; }
// ip can't be of format 172.16.xxx.xxx
if (ip[0] === 172 && ip[1] === 16) { valid = false; }
// ip can't be of format 192.168.xxx.xxx
if (ip[0] === 192 && ip[1] === 168) { valid = false; }
if (valid === true) {
return ip.join('.'); // convert ip to string format
} else {
return generateRandomIp(start, end); // try again
}
}
const ip = generateRandomIp(start, end);
console.log(ip);
每次您 运行 上面的代码片段都会在该范围内生成一个随机 IP 地址。
这是您提到的页面中的测试用例,其中表示数字 3401190660
应转换为 202.186.13.4
,所以让我们将随机生成的数字切换为这个数字并尝试它。
const start = 18925568;
const end = 18926079;
function _generateRandomIp(start, end) {
let r = 3401190660; // here is that specific number
const ip = [];
for (let i = 0; i < 4; i++) {
ip.push(r % 256);
r = Math.floor(r / 256);
}
return ip.reverse(); // put the results mod/div into correct order
}
function generateRandomIp(start, end) {
let ip = _generateRandomIp(start, end);
let valid = true;
// ip can't be of format 10.xxx.xxx.xxx
if (ip[0] === 10) { valid = false; }
// ip can't be of format 172.16.xxx.xxx
if (ip[0] === 172 && ip[1] === 16) { valid = false; }
// ip can't be of format 192.168.xxx.xxx
if (ip[0] === 192 && ip[1] === 168) { valid = false; }
if (valid === true) {
return ip.join('.'); // convert ip to string format
} else {
return generateRandomIp(start, end); // try again
}
}
const ip = generateRandomIp(start, end);
console.log(ip);
正如我们所见,该算法产生了正确的结果。
有了给定国家/地区的 IPv4 地址范围,如何生成随机地址?例如,新加坡的一组当前范围(许多范围之一)是:
+----------+----------+--------------+
| ip_from | ip_to | country_code |
+----------+----------+--------------+
| 18925568 | 18926079 | SG |
+----------+----------+--------------+
FAQ(3) 解释说
IP_Number = 16777216*w + 65536*x + 256*y + z
哪里
IP_Address = w.x.y.z
IP_Number
代表 ip_from
或 ip_to
。对于上面介绍的新加坡范围,它给了我:
16777216*w + 65536*x + 256*y + z >= 18925568; // from
16777216*w + 65536*x + 256*y + z <= 18926079; // to
如何生成随机 w
、x
、y
和 z
?
这是一个可测试的实现(在 JavaScript 中,因为可以直接在此处 运行)和一些描述。
首先您需要从指定范围内生成随机数。如果你有一个函数(我们称之为 random
)生成 0 到 0.999 之间的随机实数... [0,1)
那么你可以这样做。
num = (random() * (end - start + 1)) + start
然后你需要使用mod 256
4次将数字分成4个部分,并对给定的数字使用div 256
3次(第四次div
操作是不必要的但如果我们在循环中进行,那么为了简单起见,我们可以将它保留在那里,因为它不会改变任何东西)。
(% - modulo, // - div)
first = num % 256
num = num // 256
second = num % 256
num = num // 256
third = num % 256
num = num // 256
fourth = num % 256
然后您可以将它们推入数组 [fourth, third, second, first]
(注意此处的 order)并进行一些验证 - 有些地址是为私人互联网保留的,所以如果您碰巧要生成其中一个,只需将其丢弃并生成一个新的(您可以在此处循环或递归,直到生成一个有效的)。
这些范围内的 IP 地址根据 RFC 1918 保留:
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;
function _generateRandomIp(start, end) {
let r = Math.floor(Math.random() * (end - start + 1)) + start;
const ip = [];
for (let i = 0; i < 4; i++) {
ip.push(r % 256);
r = Math.floor(r / 256);
}
return ip.reverse(); // put the results mod/div into correct order
}
function generateRandomIp(start, end) {
let ip = _generateRandomIp(start, end);
let valid = true;
// ip can't be of format 10.xxx.xxx.xxx
if (ip[0] === 10) { valid = false; }
// ip can't be of format 172.16.xxx.xxx
if (ip[0] === 172 && ip[1] === 16) { valid = false; }
// ip can't be of format 192.168.xxx.xxx
if (ip[0] === 192 && ip[1] === 168) { valid = false; }
if (valid === true) {
return ip.join('.'); // convert ip to string format
} else {
return generateRandomIp(start, end); // try again
}
}
const ip = generateRandomIp(start, end);
console.log(ip);
每次您 运行 上面的代码片段都会在该范围内生成一个随机 IP 地址。
这是您提到的页面中的测试用例,其中表示数字 3401190660
应转换为 202.186.13.4
,所以让我们将随机生成的数字切换为这个数字并尝试它。
const start = 18925568;
const end = 18926079;
function _generateRandomIp(start, end) {
let r = 3401190660; // here is that specific number
const ip = [];
for (let i = 0; i < 4; i++) {
ip.push(r % 256);
r = Math.floor(r / 256);
}
return ip.reverse(); // put the results mod/div into correct order
}
function generateRandomIp(start, end) {
let ip = _generateRandomIp(start, end);
let valid = true;
// ip can't be of format 10.xxx.xxx.xxx
if (ip[0] === 10) { valid = false; }
// ip can't be of format 172.16.xxx.xxx
if (ip[0] === 172 && ip[1] === 16) { valid = false; }
// ip can't be of format 192.168.xxx.xxx
if (ip[0] === 192 && ip[1] === 168) { valid = false; }
if (valid === true) {
return ip.join('.'); // convert ip to string format
} else {
return generateRandomIp(start, end); // try again
}
}
const ip = generateRandomIp(start, end);
console.log(ip);
正如我们所见,该算法产生了正确的结果。