gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:44 26 4
gpt4 key购买 nike

有了给定国家/地区的 IPv4 地址范围,如何生成随机地址?例如,新加坡的一组当前范围(许多范围之一)是:

+----------+----------+--------------+
| ip_from | ip_to | country_code |
+----------+----------+--------------+
| 18925568 | 18926079 | SG |
+----------+----------+--------------+

source: lite.ip2location.com

FAQ(3)解释说

IP_Number = 16777216*w + 65536*x + 256*y + z

在哪里

IP_Address = w.x.y.z

IP_Number 代表ip_fromip_to。对于上面介绍的新加坡范围,它给了我:

16777216*w + 65536*x + 256*y + z >= 18925568; // from
16777216*w + 65536*x + 256*y + z <= 18926079; // to

如何生成随机的 wxyz

最佳答案

这是一个可测试的实现(在 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] (注意这里的顺序)并做一些验证——一些地址是为私有(private)互联网保留的,所以如果你碰巧生成了其中一个,就把它扔掉并生成一个新的(你可以循环或在这里递归,直到你生成一个有效的)。

这些范围内的 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);

正如我们所见,该算法产生了正确的结果。

关于algorithm - 如何为给定国家/地区生成随机 IPv4 号码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50383931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com