uniqid randomize rand name mt_srand mt_rand php performance optimization random

randomize - random name php



Diferencia entre mt_rand() y rand() (6)

Actualización (PHP 7.1):

rand() y srand() ahora se han convertido en alias de mt_rand() y mt_srand() , respectivamente. Esto significa que la salida para las siguientes funciones tiene cambios: rand() , shuffle() , str_shuffle() y array_rand() .

Eso significa que desde la versión 7.1 no hay diferencia práctica entre ambos porque rand llama a mt_rand internamente .

Antes de PHP 7.1:

Usar rand() no es una mala práctica si no se usa con fines de seguridad, generalmente uso rand() (hábito?).

Si necesita una enorme cantidad de números aleatorios, necesitará mt_rand en mt_rand lugar rand . mt_rand tiene un período de 2 19937 - 1, mucho mejor que rand (2 32 ). Eche un vistazo a este artículo sobre la generación de patrones gráficos usando rand y mt_rand .

Periodicity y la entropy son las únicas razones para usar mt_rand() lugar de rand() y no para mejorar la seguridad o la velocidad.

Matemáticamente, mt_rand tiene más entropy y una mayor Periodicity que rand (2 19937 −1 vs. 2 32 ).

Si necesita algunos números aleatorios y la seguridad no es un problema, rand hará el trabajo (obtenga un número aleatorio para decidir disparar un proceso de limpieza).

Probar mejoras de velocidad

En la práctica, no hay mucha diferencia en la velocidad entre las dos funciones (¿tal vez porque la sobrecarga del contenedor PHP⇔C?).

Código de prueba PHP:

<?php for ($c = 0; $c < 3; $c++) { $start = microtime(true); $sum = 0.0; for ($i = 0; $i < 100000000; $i++) { $sum += rand(); } printf(''[rand %d] Time: %.3f s%s'', $c, microtime(true) - $start, PHP_EOL); } for ($c = 0; $c < 3; $c++) { $start = microtime(true); $sum = 0.0; for ($i = 0; $i < 100000000; $i++) { $sum += mt_rand(); } printf(''[mt_rand %d] Time: %.3f s%s'', $c, microtime(true) - $start, PHP_EOL); }

Pruebas en PHP 7.0.19:

$ php timing.php [rand 0] Time: 4.658 s [rand 1] Time: 4.664 s [rand 2] Time: 4.654 s [mt_rand 0] Time: 4.267 s [mt_rand 1] Time: 4.255 s [mt_rand 2] Time: 4.261 s

Pruebas en PHP 5.4.45 (máquina más lenta):

$ php timing.php [rand 0] Time: 10.862 s [rand 1] Time: 10.889 s [rand 2] Time: 10.615 s [mt_rand 0] Time: 10.948 s [mt_rand 1] Time: 9.883 s [mt_rand 2] Time: 10.190 s

Solo 6-9% y no 400% como se afirma.

Uso por motivos de seguridad

Pero si su aplicación necesita mucha entropía debido a problemas de seguridad, necesitará una forma más segura y openssl_random_pseudo_bytes() posiblemente sea la mejor solución, ¿funciona (mucho mejor pero más lento? Necesitamos seguridad sobre la velocidad?) Confiando en openssl cuestiones relacionadas

Ni rand() ni mt_rand() son lo suficientemente seguros :

Precaución Esta función no genera valores criptográficamente seguros y no debe usarse con fines criptográficos. Si necesita un valor criptográficamente seguro, considere usar random_int() , random_bytes() o openssl_random_pseudo_bytes() lugar.

Hay extensiones PHP como random_compat , pero no recomendé usarlas si no es necesario.

¿Cuál es la diferencia entre usar mt_rand($min, $max) y rand($min, $max) sobre la velocidad?


Actualizar

Desde PHP 7.1 mt_rand ha reemplazado a rand completo, y rand se convirtió en un alias para mt_rand . La respuesta a continuación se centra en las diferencias entre las dos funciones para versiones anteriores y las razones para introducir mt_rand .

¡La velocidad no era por mt_rand se introdujo mt_rand !

La función rand existía mucho antes de mt_rand , pero estaba profundamente defectuosa. Un PRNG debe obtener algo de entropía, un número a partir del cual genera una secuencia de números aleatorios. Si imprime una lista de diez números generados por rand() así:

for ($i=0;$i<10;++$i) echo rand(), PHP_EOL;

La salida se puede utilizar para determinar cuál era la semilla del rand y, con ella, puede predecir los próximos números aleatorios. Existen herramientas que hacen esto, así que busca un poco en Google y pruébalo.

También hay un problema con rand muestra patrones relativamente rápidos en sus números aleatorios como se demuestra aquí . Un problema mt_rand parece resolver mucho mejor también.

mt_rand utiliza un mejor algoritmo de aleatorización (Mersenne Twist), que requiere que se conozcan más números aleatorios antes de poder determinar la semilla y que sea ​​más rápida. Esto no significa que mt_rand sea, por definición, más rápido que rand , solo significa que la forma en que se generan los números es más rápida y parece no tener un impacto real en el rendimiento de la función, como lo han demostrado otras respuestas aquí.
De cualquier manera, eche un vistazo a los documentos mt_srand y mt_srand . Estoy seguro de que contendrán más información

Si el algoritmo de mt_rand traduce en un aumento en el rendimiento, entonces eso es excelente para usted, pero es una feliz coincidencia. TL; TR:

mt_rand se introdujo para solucionar los problemas que existen en rand !



El Manual de PHP en mt_rand() establece que:

que producirá números aleatorios cuatro veces más rápido que lo que proporciona el libc rand () promedio.


Parecen tener la misma velocidad:

function timeit($times, $func) { $t = microtime(1); while($times--) $func(); return microtime(1) - $t; } echo PHP_OS, " ", phpversion(), "/n"; echo timeit(100000, function() { rand(0,1000); }), "/n"; echo timeit(100000, function() { mt_rand(0,1000); }), "/n";

Resultados para OSX Mavericks y VirtualBox''ed Ubuntu 11:

Darwin 5.5.19 0.038038969039917 0.033117055892944 Linux 5.3.6-13ubuntu3.10 0.031459093093872 0.031935214996338

Si estas medidas son correctas, el comentario manual mencionado en otra parte debe considerarse incorrecto / obsoleto.



A continuación se muestra la diferencia de velocidad para ambos:
mt_rand($min, $max) es cuatro veces más rápido en comparación con rand($min, $max)

La razón es que rand($min, $max) usa el generador de números aleatorios libc, mientras que mt_rand($min, $max) usa Mersenne Twister, que es cuatro veces más rápido.

Espero que resuelva tu duda.
Gracias.