使用PHP生成随机结构化数据

时间:2013-06-19 19:13:51

标签: php

我想知道如何创建具有与IPv6类似结构的随机PHP值

  

示例:2001:0db8:85a3:0042:1000:8a2e:0370:7334:nc21

我可以使用mt_rand(0000,9999).":"....... and so on但是这只会创建数值,而且它是多余的。在一个函数中,是否有一种更简单的方法可以实现它?

感谢每一位人员的反馈和信息,最后我选择使用以下代码位

$randomString = sha1(dechex(mt_rand(0, 2147483647)));
$token = implode(':', str_split($randomString, 4));

结果:

  

9ec0:4709:926E:4cbf:fa87:2ac3:03da:f547:485B:6464

3 个答案:

答案 0 :(得分:5)

避免使用rand请参阅str_shuffle and randomness尝试:

echo myRand(36);

输出

023c:631e:f770:ec5b:f06b:917a:b839:4aea:45b7

使用的功能

function myRand($length, $sep = ":", $space = 4) {
    if (function_exists("mcrypt_create_iv")) {
        $r = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
    } else if (function_exists("openssl_random_pseudo_bytes")) {
        $r = openssl_random_pseudo_bytes($length);
    } else if (is_readable('/dev/urandom')) {
        $r = file_get_contents('/dev/urandom', false, null, 0, $length);
    } else {
        $i = 0;
        $r = "";
        while($i ++ < $length) {
            $r .= chr(mt_rand(0, 255));
        }
    }
    return wordwrap(substr(bin2hex($r), 0, $length), $space, $sep, true);
}

答案 1 :(得分:3)

使用cryptografic哈希函数。它们默认输出十六进制:

md5(rand()) // eg: ccc4fd993dd07dac621455c7c924d38f

其他implode使用冒号返回值str_split(md5(rand()), 4)来创建类似这样的内容:

implode(':', str_split('ccc4fd993dd07dac621455c7c924d38f', 4));
// ccc4:fd99:3dd0:7dac:6214:55c7:c924:d38f

取决于您希望随机使用substr来截断哈希值的块数。


注意此方法不会创建真正的随机性。如果需要真正的随机数据,请看看巴巴的答案。

答案 2 :(得分:1)

您可以生成0到65 535(0xffff)之间的随机数,然后使用dechex将其转换为十六进制。

请注意,字符串nc21的结尾不是有效的十六进制数,因此不是有效的IPv6地址。