如comments of mt_rand()
中所述,它在安全方面很弱,我们应该使用/ dev / urandom。我的问题是,从urandom我得到一个二进制字符串。
如何将此二进制字符串转换为0-9a-zA-Z?
看起来base_convert()
在这里不起作用。
答案 0 :(得分:3)
仅为记录完整功能:
function randomFromDev($len)
{
$fp = @fopen('/dev/urandom','rb');
$result = '';
if ($fp !== FALSE) {
$result .= @fread($fp, $len);
@fclose($fp);
}
else
{
trigger_error('Can not open /dev/urandom.');
}
// convert from binary to string
$result = base64_encode($result);
// remove none url chars
$result = strtr($result, '+/', '-_');
// Remove = from the end
$result = str_replace('=', ' ', $result);
return $result;
}
答案 1 :(得分:2)
您可以使用bin2hex进行二进制到字符串转换。 PHP 7 random_bytes添加了随机查找。
<?php
$bytes = random_bytes(5);
$str = bin2hex($bytes);
var_dump($str);
// string(10) "385e33f741"
?>
答案 2 :(得分:1)
只需使用base64_encode($yourbinaryurandomstring)
有了这个结果,你可以例如使用像sha1()
或md5()
这样的哈希函数,应该没问题。您甚至没有对"="
我不太确定哈希函数是否可以为自己读取二进制字符串,只需试一试。
答案 3 :(得分:1)
使用/dev/urandom
的一种方法是功能uiniqid,它应该符合您的需求。
但是,如果您需要真随机数,最好使用/dev/random
,因为/dev/urandom
仍然是伪随机数生成器,它使用/dev/random
作为种子值
访问随机数流并不难。
<?php
$r = unpack('v*', fread(fopen('/dev/random', 'r'),16));
$uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
$r[1], $r[2], $r[3], $r[4] & 0x0fff | 0x4000,
$r[5] & 0x3fff | 0x8000, $r[6], $r[7], $r[8]);
?>
显然这不是生产代码。