with str rand number name generate gen aleatorio php string random passwords

php - rand - str_shuffle y aleatoriedad



random name generator php (3)

Una mejor solución sería mt_rand que utiliza Mersenne Twister, que es mucho mejor.

Como se ha señalado, el método str_shuffle no es equivalente al código que ya estoy usando y será menos aleatorio debido a que los caracteres de la cadena son los mismos que la entrada, solo con el cambio de orden. Sin embargo, todavía tengo curiosidad sobre cómo la función str_shuffle aleatoriza su cadena de entrada.

Para hacer que la salida sea igual, solo use 0,1 y observe la representación visual de cada una de las funciones

Código de prueba simple

header("Content-type: image/png"); $im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream"); $white = imagecolorallocate($im, 255, 255, 255); for($y = 0; $y < 512; $y ++) { for($x = 0; $x < 512; $x ++) { if (testMTRand()) { //change each function here imagesetpixel($im, $x, $y, $white); } } } imagepng($im); imagedestroy($im); function testMTRand() { return mt_rand(0, 1); } function testRand() { return rand(0, 1); } function testShuffle() { return substr(str_shuffle("01"), 0, 1); }

Salida testRand ()

Salida testShuffle ()

Salida testMTRand ()

Entonces, básicamente, me gustaría saber cómo str_shuffle aleatoriza la cadena. ¿Está usando rand () o mt_rand ()? Estoy usando mi función de cadena aleatoria para generar contraseñas, por lo que importa la calidad de la aleatoriedad.

Puedes ver claramente que str_shuffle produce casi la misma salida que rand ...

Hace un tiempo escribí un generador de cuerdas al azar que construye una cuerda usando el carácter mt_rand () th en una cuerda hasta que se alcanza la longitud deseada.

public function getPassword () { if ($this -> password == '''') { $pw = ''''; $charListEnd = strlen (static::CHARLIST) - 1; for ($loops = mt_rand ($this -> min, $this -> max); $loops > 0; $loops--) { $pw .= substr (static::CHARLIST, mt_rand (0, $charListEnd), 1); } $this -> password = $pw; } return $this -> password; }

(CHARLIST es una constante de clase que contiene un grupo de caracteres para la contraseña. $ Min y $ max son restricciones de longitud)

Hoy, al investigar algo completamente diferente, me encontré con el siguiente código:

function generateRandomString ($length = 10) { return substr(str_shuffle ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length); }

Esto logra más o menos el mismo efecto que mi código basado en mt_rand () en una línea. Me gusta mucho por esa sencilla razón, menos líneas de código siempre son buenas. :)

Pero cuando busqué str_shuffle en el manual de PHP, la documentación que contenía era bastante liviana. Una cosa que realmente me entusiasmaba era saber qué algoritmo usa para la aleatoriedad. El manual no menciona qué tipo de aleatorización se realiza para obtener la cadena mezclada. Si usa rand () en lugar de mt_rand (), seguir con mi solución actual puede ser mejor después de todo.

Entonces, básicamente, me gustaría saber cómo str_shuffle aleatoriza la cadena. ¿Está usando rand () o mt_rand ()? Estoy usando mi función de cadena aleatoria para generar contraseñas, por lo que importa la calidad de la aleatoriedad.

ACTUALIZACIÓN : Como se ha señalado, el método str_shuffle no es equivalente al código que ya estoy usando y será menos aleatorio debido a que los caracteres de la cadena son los mismos que la entrada, solo con el cambio de orden. Sin embargo, todavía tengo curiosidad sobre cómo la función str_shuffle aleatoriza su cadena de entrada.


Tenga en cuenta que este método no debe utilizarse si su aplicación está realmente enfocada en la seguridad. El Mersenne Twister NO es criptográficamente seguro. Un PRNG puede arrojar valores que estadísticamente parecen ser aleatorios, pero aún así son fáciles de romper.


Todavía no es segura criptográficamente, pero aquí hay una manera de usar str_shuffle() tiempo que permite la repetición de caracteres, mejorando así la complejidad ...

generate_password($length = 8, $strength = 3) { if ($length < 6) $length = 6; if ($length > 32) $length = 32; // Excludes [0,O,o,1,I,i,L,l,1] on purpose for readability $chars = ''abcdefghjkmnpqrstuvwxyz''; if ($strength >= 2) $chars .= ''23456789''; if ($strength >= 3) $chars .= strtoupper($lower); if ($strength >= 4) $chars .= ''!@#$%&?''; return substr(str_shuffle(str_repeat($chars, $length)), 0, $length); }

$chars se repite $length veces antes de que la cadena se baraje para hacer que esto sea un poco mejor que arrastrando solo una sola ocurrencia.

Solo usamos esto en sistemas que no almacenan información sensible;)