已知指定国家的IPv4地址范围,如何生成随机IPv4地址?
如何根据指定国家的IPv4地址范围生成随机IP地址?
已知指定国家的IPv4地址范围后,如何生成随机地址?例如,新加坡的其中一组当前地址范围如下:
+----------+----------+--------------+ | ip_from | ip_to | country_code | +----------+----------+--------------+ | 18925568 | 18926079 | SG | +----------+----------+--------------+
来源:lite.ip2location.com
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?
解决方案
不用纠结直接解四个变量的不等式,有个更简单且靠谱的思路:
步骤1:生成范围内的随机IP整数
直接在ip_from和ip_to的区间里生成一个随机整数random_ip_num,比如在18925568到18926079之间取任意整数就行。这样能从根源保证后续生成的IP一定在目标范围内。
步骤2:把整数拆解为IPv4地址段
通过位运算或者除法取余的方式,把随机整数拆成w.x.y.z四个部分:
w:将随机数右移24位(等价于除以16777216取整)x:将随机数右移16位后,和0xff做按位与运算(只保留最后8位)y:将随机数右移8位后,和0xff做按位与运算z:直接将随机数和0xff做按位与运算
示例代码(Python)
import random # 新加坡的IP范围数字 ip_from = 18925568 ip_to = 18926079 # 生成范围内的随机IP整数 random_ip_num = random.randint(ip_from, ip_to) # 拆解为w.x.y.z w = random_ip_num >> 24 x = (random_ip_num >> 16) & 0xff y = (random_ip_num >> 8) & 0xff z = random_ip_num & 0xff # 拼接成IP地址字符串 random_ip = f"{w}.{x}.{y}.{z}" print(random_ip)
举个实际计算的例子:如果随机取到18925800,拆解后得到的IP是1.32.200.232,这个地址完全落在给定的新加坡IP区间内。
这种方法的优势在于逻辑简单,避免了多变量组合可能出现的边界错误,能100%保证生成的IP符合要求。
内容的提问来源于stack exchange,提问作者wscourge
相关产品推荐
相关产品推荐

