【问题标题】:Generate Random IP address using PHP使用 PHP 生成随机 IP 地址
【发布时间】:2012-05-03 08:35:40
【问题描述】:

我想生成一个随机 IP 地址。

【问题讨论】:

  • 你为什么接受更复杂的答案?

标签: php numbers


【解决方案1】:

64 位 PHP 上:

long2ip(rand(0, 4294967295));

在 2021 年使用任何受支持的 PHP 版本(7.4 和 8.0)。

注意:由于现在几乎所有机器都是 x64 并且正在放弃开发 32 位操作系统,如果这不起作用,您可能需要下载 x64 版本的 PHP。

【讨论】:

  • 老实说,这里是出处:php.net/manual/en/function.long2ip.php#61208
  • 经过测试,总是返回 0.0.0.0
  • 当然它返回 0。这里的问题是 rand 或 mt_rand 不支持那么大的数字。最大最大值类似于 2147483647。我在回答中对此进行了解释。
【解决方案2】:

检查mt_rand func

你可能想要运行这个:

<?php
    $randIP = mt_rand(0, 255) . "." . mt_rand(0, 255) . "." . mt_rand(0, 255) . "." . mt_rand(0, 255);
?>

【讨论】:

    【解决方案3】:
    $ip = long2ip(mt_rand());
    

    这种方式可读性稍强。

    【讨论】:

    • 正如我在其他评论中指出的...这不适用于整个 ip 范围...最大 ip 将是127.255.255.255,因为mt_rands 最大值是 2147483647。如果您通过更高的值,它返回false
    【解决方案4】:

    根据这里的一些答案,我决定添加一个答案来纠正一些错误...

    mt_rand(int $min, int $max);
    

    一些样本使用此函数,最大值为 4294967295。但是这个函数只支持2147483647的最大值,实际上是一半。传递更大的数字将返回 false。在不传递任何内容的情况下使用此函数也只会给出所需值的一半。所以

    long2ip(mt_rand());
    

    将返回127.255.255.255的最大ip

    要拥有完整的系列,您需要一些类似的东西:

    long2ip(mt_rand()+mt_rand());
    

    但即使在此示例中,您最多也将获得255.255.255.254。因此,要拥有完整的范围,您需要第三个mt_rand()

    用简写代码获取总范围的正确方法是:

    $ip = long2ip(mt_rand()+mt_rand()+mt_rand(0,1));
    

    注意使用 + 而不是 *。因为max value * max value 会按预期返回255.255.255.255,但获得较低IP 的机会不再那么好。为了保持使用 * 的好机会,您可以执行以下操作:

    $ip = long2ip((mt_rand()*mt_rand(1,2))+mt_rand(0,1));
    

    【讨论】:

    • 你的答案是错误的。您说的是通常的 32 位限制。使用 64 位机器测试@Pavel Strakhov 的答案。
    • 所以@mgutt,为什么我的回答在它适用于 32 位系统时会出错。比它必须是正确的。您可以评论如下:“这仅适用于 32 位系统”
    • 我会说这是错误的,因为您说它是 mt_rand() 的一般限制,其他答案一定是错误的。我没有投反对票,因为您可以自己添加 32 位注释。一件奇怪的事情是,德语和法语的 mt_rand() 函数描述有一个警告,指出高于 2^32 的最大值返回的大多是偶数?! php.net/manual/de/function.mt-rand.php 如果这是正确的,那么您的版本也更适合 64 位系统。
    【解决方案5】:

    如果有的话,您还可以从自己的网络服务器日志中获取有效 IP 池:

    cat /var/log/apache2/access_log |cut -d' ' -f1|egrep -v '[a-z]'|sort|uniq > 大量的.txt

    然后在php中:

    $ips = file('lotsofip.txt');    
    echo $ips[array_rand($ips)];
    

    【讨论】:

      【解决方案6】:
      $ip = intval(rand()%255).'.'.intval(rand()%255).'.'.intval(rand()%255).'.'.intval(rand()%255);
      

      【讨论】:

        猜你喜欢
        • 2012-03-03
        • 2017-10-02
        • 2014-01-27
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多