web-dev-qa-db-fra.com

PHP Rand () contre random_int ()

Comme php.net indique:random_int() fonction Génère des entiers pseudo-aléatoires cryptographiquement sécurisés .

Mais, quelqu'un peut-il expliquer quelle est la différence entre Rand() & random_int()? Puis-je utiliser random_int() au lieu de Rand() lorsque je n'ai besoin que d'un entier aléatoire? Lequel est le plus rapide?

17
Behrad Khodayar

En revoyant la question et en voyant qu'il y a eu une réponse donnée, je trouve juste que je soumette mes commentaires à une réponse, vu qu'ils ont été soumis avant.

Le manuel sur la fonction PHP 7 random_int() indique:

"Renvoie un entier aléatoire cryptographiquement sécurisé compris entre min et max, inclus."

et pour Rand()

* Cette fonction ne génère pas de valeurs cryptographiquement sécurisées "*

Commentaire de l'OP:

"@ Fred-ii- merci. Mais que signifie" pseudo-aléatoire cryptographiquement sécurisé "? - NDFA"

Cela peut être trouvé dans les liens suivants selon mes conclusions:

Quels États:

Un générateur de nombres pseudo-aléatoires (CSPRNG) ou un générateur de nombres pseudo-aléatoires cryptographiques (CPRNG) [1] est un générateur de nombres pseudo-aléatoires (PRNG) avec des propriétés qui le rendent approprié pour utiliser en cryptographie.


En ce qui concerne les performances, vous devrez exécuter vous-même un benchmark.

13
Funk Forty Niner

À partir de PHP 7.1, Rand() est essentiellement un alias pour mt_Rand() . Le plus récent random_int() est la méthode la plus lente, mais seulement sécurisée des trois.

<?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);

Résultats:

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

Comme la plupart des générateurs de nombres, l'utilisation de Rand () n'est pas sécurisée car elle ne génère pas de valeurs cryptographiquement sécurisées et la sortie de Rand () est prévisible.

PHP 7.0 introduit random_bytes et random_int en tant que fonctions de base qui sont exemptes des problèmes rencontrés par la plupart des générateurs de nombres aléatoires.

3
T. AKROUT