Necesito un reemplazo para la función rand()
de PHP que utiliza un generador de números aleatorios criptográficamente fuerte.reemplazar rand() con openssl_random_pseudo_bytes()
La función openssl_random_pseudo_bytes()
le permite acceder al generador de números aleatorios fuertes, pero genera sus datos como una cadena de bytes. En cambio, necesito un número entero entre 0 y X.
Imagino que la clave es obtener la salida de openssl_random_pseudo_bytes()
en un número entero, entonces puede hacer cualquier cálculo que necesite. Puedo pensar en algunas formas de "fuerza bruta" de convertir de una cadena de bytes a un entero, pero esperaba algo ... elegante.
mt_rand() dará números aleatorios mucho mejor calidad que rand(), pero no es criptográficamente fuerte tampoco. – David
cuidado, esta respuesta es incorrecta. para ser más específico, la parte "% $ range" es incorrecta. Tome la siguiente situación: desea generar números entre 1 (incluido) y 4 (excluyendo) (ya que realiza max-min). $ range = 3. Ahora 3 no se divide uniformemente en 2^8, lo que significa que 1 va a ser más común que 3. Tenga mucho cuidado, quería crear un generador de números aleatorios seguro, pero inadvertidamente lo hizo inseguro, esta es la razón por la cual se recomienda usar implementaciones existentes. – chacham15
@ chacham15: Si entiendes correctamente, en un rango de 8 bits obtienes 85 juegos de [1,2,3] más un único [1,], lo que hace que sea más probable que aparezca un "1" alrededor de un 1,17% más alto que " 2 "o" 3 ", ¿verdad? Como resolverías este problema? Obviamente, usar una * implementación existente * no es una opción, o no habría hecho la pregunta. – tylerl