我想知道如何创建具有与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
答案 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地址。