gpt4 book ai didi

javascript - 从 JS 中的子网生成随机 IP 地址

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:00 24 4
gpt4 key购买 nike

我正在尝试生成一个给定 IP 地址子网的随机 IP 地址。有很多资源可用于生成随机 IP,但我要求它是从特定子网内生成的。

我使用了一个名为 netmask 的 npm 模块- 但是实现绝对不优雅。任何人都可以为此提供一些巧妙的指示吗?

var netmask = require("netmask").Netmask
var block = new netmask('10.0.0.0/24')
console.log(block) // gives block details

var blockSize = block.size - 1 ;
var randomIndex = Math.floor(Math.random() * blockSize ) +1; // generate a random number less than the size of the block

console.log("randomIndex is: " + randomIndex);

block.forEach(function(ip, long, index){

if(index == randomIndex){
console.log('IP: ' + ip)
console.log('INDEX: ' + index)
// cannot break! this is a forEach :(
}
});

最佳答案

这很容易,没有任何额外的依赖,虽然我没有给你一个确切的答案,但我知道如何 IP's work in general以及如何解决您的问题。如果您自己动手,本课会更有值(value)。

我们取 10.0.0.0/20 CIDR例如。让我们将 10.0.0.0 转换为位:

00001010.00000000.00000000.00000000

我们去掉了 20 位,因为这是从左边开始的网络,所以我们为主机留下了 0000.00000000( 点在这里只是为了便于阅读):

00001010.00000000.00000000.00000000 Network
XXXXXXXX.XXXXXXXX.XXXX0000.00000000 Strip 20 bits of the subnet

将每个八位字节与剩余位随机打乱,例如我们可以得到 0101.10001010。避免使用只有 1 的主机 (1111.11111111),因为它是 broadcast IP ,它仍然是一个有效的 IP,但不适用于主机。将子网部分与主机部分连接起来。我们得到:

// S=Subnet, H=Host
SSSSSSSS.SSSSSSSS.SSSSHHHH.HHHHHHHH
00001010.00000000.00000101.10001010

这是 1010 = 100101 = 510001010=138 所以最终地址是 10.0.5.138


既然写起来很有趣,我可以给你我自己的实现,它不涉及任何字符串操作。如您所见,IPv4 地址是一个 2^32 无符号整数。因此我们可以应用基础数学:

let ipv4 = {
random: function (subnet, mask) {
// generate random address (integer)
// if the mask is 20, then it's an integer between
// 1 and 2^(32-20)
let randomIp = Math.floor(Math.random() * Math.pow(2, 32 - mask)) + 1;

return this.lon2ip(this.ip2lon(subnet) | randomIp);
},
ip2lon: function (address) {
let result = 0;

address.split('.').forEach(function(octet) {
result <<= 8;
result += parseInt(octet, 10);
});

return result >>> 0;
},
lon2ip: function (lon) {
return [lon >>> 24, lon >> 16 & 255, lon >> 8 & 255, lon & 255].join('.');
}
};

// unit test
console.log(
"192.168.0.35" === ipv4.lon2ip(ipv4.ip2lon('192.168.0.35')) ?
'Test passed' :
'Test failed'
);

for (let i = 0; i < 5; i++) {
console.log(ipv4.random('10.0.0.0', 8));
}

关于javascript - 从 JS 中的子网生成随机 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815725/

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