PHP rand vs mt_rand vs openssl_random_pseudo_bytes

时间:2015-02-07 13:23:46

标签: php random

我想生成一个随机字符串并正在做一些研究并找到以下链接:

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;的正确方法吗?功能?

3 个答案:

答案 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