我想生成一个随机字符串并正在做一些研究并找到以下链接:
http://golearnphp.com/php-rand-vs-mt_rand-and-openssl_random_pseudo_bytes/
function generateRandom($length) {
$validCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789';
$myKeeper = '';
for ($n = 1; $n < $length; $n++) {
$whichCharacter = rand(0, strlen($validCharacters) - 1);
$myKeeper .= $validCharacters{$whichCharacter};
}
return $myKeeper;
}
function generateRandomdMT($length) {
$validCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789';
$myKeeper = '';
for ($n = 1; $n < $length; $n++) {
$whichCharacter = mt_rand(0, strlen($validCharacters) - 1);
$myKeeper .= $validCharacters{$whichCharacter};
}
return $myKeeper;
}
$start = microtime(true);
echo htmlentities(generateRandom(100000));
var_dump(microtime(true) - $start);
$start = microtime(true);
echo htmlentities(generateRandomdMT(100000));
var_dump(microtime(true) - $start);
$start = microtime(true);
echo htmlentities(substr(base64_encode(openssl_random_pseudo_bytes(100000)), 0, 100000));
var_dump(microtime(true) - $start);
在帖子中,作者说openssl_random_pseudo_bytes比其他两个快得多。这是真的? openssl_random_pseudo_bytes真的那么快吗?这是测试&#34;牢度&#34;的正确方法吗?功能?
答案 0 :(得分:1)
openssl_random_pseudo_bytes创建为加密(检查第二个参数)。兰德是旧兰德函数,具有较小的重复周期。 MT_Rand优于rand但不应该被加密系统使用。
我敢打赌,执行时间之间的差异不会影响您的申请。
另外。这些函数返回不同的结果。前两个返回字符串,有36个可能的字母。第三个返回带有64个可能符号的字符串。两个第一函数的结果比第三函数短。
如果您正在进行优化以加速应用程序的第一件事,那么您应该知道:如何分析代码。
答案 1 :(得分:0)
在帖子中,作者说openssl_random_pseudo_bytes比其他两个快得多。这是真的吗?
在正常情况下,mt_rand()
明显快于openssl_random_pseudo_bytes()
。
在你发布的测试代码中,它只是比较慢,因为你正在比较苹果和橘子。对于rand()
和mt_rand()
,您使用的复杂函数一次只能构建一个字符串,而对于openssl_random_pseudo_bytes()
,您使用的是base64_encode()
生成的原始二进制流。这会更快。
如果您可以从mt_rand()或rand()获取原始二进制流,或者从openssl_random_pseudo_bytes()
获取0到63的数字序列,则可以进行苹果与苹果的比较。
在我的测试中,当我使用mt_rand()
以获得等效输出openssl_random_pseudo_bytes(4)
时,我发现unpack('V', openssl_random_pseudo_bytes(4) & "\xff\xff\xff\x7f")
的速度是mt_rand()
的4倍。然而,这在技术上仍然是苹果到橙子的情况,因为我正在对其进行额外的处理,以便将它与另一个相匹配,只是与你的方向相反。
答案 2 :(得分:0)
您问这个问题的时间,这里有一个错误报告> https://bugs.php.net/bug.php?id=70014(php 5.6.10)在新版本的PHP中似乎已修复。
我对它的使用经验一直不必要,我更喜欢Mt_Rand(),但是如果您像我一样出于加密目的而生成随机值,则不要使用它,而应该使用random_bytes( )ref。 https://www.php.net/manual/en/function.random-bytes.php