PHP兰特VS mt_rand VS openssl_random_pseudo_bytes(PHP

2019-10-21 19:37发布

我想生成一个随机字符串,并做了一些研究,发现了以下链接:

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更快了? 那是正确的方法来测试的功能,“色牢度”?

Answer 1:

openssl_random_pseudo_bytes创建为加密强(检查第二PARAM)。 兰德是具有重复的小周期旧rand函数。 MT_Rand比兰特更好,但不应该被加密系统使用。

我敢打赌,执行时间之间的差异不会对您的应用程序产生影响。

也。 这些函数返回不同的结果。 前两个返回的字符串与36个可能的字母。 和第三返回一个字符串64个可能的符号。 两个第一函数的结果比第三个更短。

如果你正在优化加快,你应该知道你的应用程序的第一件事:如何分析你的代码。



Answer 2:

在帖子的作者是说,openssl_random_pseudo_bytes是显著快于其他两种。 这是真的?

在正常情况下mt_rand()比显著快openssl_random_pseudo_bytes()

这只是在你张贴,因为你是在比较苹果和桔子测试代码慢。 对于rand()mt_rand()使用的是复杂的功能,这同时建立一个字符串一个字节,而对于openssl_random_pseudo_bytes()你使用它与生产原始二进制流base64_encode()这将是更快。

如果你能得到一个原始的二进制流出来mt_rand()或RAND(),或数字0到63的顺序的openssl_random_pseudo_bytes()你可以做一个苹果,苹果的比较。

在我的测试中,我发现mt_rand()约4倍的速度openssl_random_pseudo_bytes(4)当我用unpack('V', openssl_random_pseudo_bytes(4) & "\xff\xff\xff\x7f")以获得等效输出到mt_rand() 然而,这仍然是技术上的苹果和橘子的情况,因为我为了匹配到其他的,只是在相反的方向上给你一个做其他处理。



文章来源: PHP rand vs mt_rand vs openssl_random_pseudo_bytes
标签: php random