web-dev-qa-db-ja.com

PHP Rand()vs. random_int()

php.netが示すように:random_int() function暗号的に安全な擬似乱数整数を生成します

しかし、誰かがRand()random_int()の違いを説明できますか?ランダムな整数のみが必要な場合、random_int()の代わりにRand()を使用できますか?どちらが速いですか?

17
Behrad Khodayar

質問を再検討し、与えられた回答があったことを確認します。回答にコメントを送信するのは公正であり、以前に送信されたことを確認します。

PHP 7のrandom_int()関数に関するマニュアル:

"最小値から最大値の範囲で、暗号で保護されたランダムな整数を返します。"

およびRand()の場合

*この関数は暗号的に安全な値を生成しません "*

OPのコメント:

"@ Fred-ii-ありがとう。しかし、「暗号的に安全な擬似ランダム」とはどういう意味ですか?– NDFA"

私の発見によると、それは次のリンクで見つけることができます:

どの州:

暗号的に安全な擬似乱数ジェネレーター(CSPRNG)または暗号化擬似乱数ジェネレーター(CPRNG)[1]は、以下に適したプロパティを持つ擬似乱数ジェネレーター(PRNG)です。暗号化で使用します。


パフォーマンスに関しては、自分でベンチマークを実行する必要があります。

13

PHP 7.1、 Rand() 現在、基本的に mt_Rand() のエイリアスです。 random_int() は最も遅いですが、3つの安全な方法です。

<?php

$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
    $sum += Rand(0, 32767);
}
printf('[Rand] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);

$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
    $sum += mt_Rand(0, 32767);
}
printf('[mt_Rand] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);

$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
    $sum += random_int(0, 32767);
}
printf('[random_int] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);

結果:

[Rand] Time: 10.973 s
[mt_Rand] Time: 9.628 s
[random_int] Time: 23.069 s
10
Matt Janssen

ほとんどの数値ジェネレーターと同様に、Rand()を使用することは暗号的に安全な値を生成せず、Rand()の出力は予測可能であるため、安全ではありません。

PHP 7.0では、random_bytesとrandom_intがコア関数として導入され、ほとんどの乱数ジェネレーターが抱える問題から解放されています。

3
T. AKROUT