1

我想知道如何继续创建与 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

4

3 回答 3

5

避免使用rand see str_shuffle 和 randomness try :

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);
}
于 2013-06-19T19:30:05.453 回答
3

使用密码哈希函数。他们默认输出十六进制:

md5(rand()) // eg: ccc4fd993dd07dac621455c7c924d38f

否则implode,带有冒号的返回值str_split(md5(rand()), 4)会创建如下内容:

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

取决于您希望随机使用多少块substr来截断散列。


请注意,此方法不会产生真正的随机性。如果需要确实需要随机数据,请查看 Baba 的答案。

于 2013-06-19T19:17:55.817 回答
1

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

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

于 2013-06-19T19:16:21.240 回答