Pregunta Generador de cadenas aleatorias PHP


Intento crear una cadena aleatoria en PHP, y no obtengo ningún resultado con esto:

<?php
function RandomString()
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring = $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}
RandomString();
echo $randstring;

¿Qué estoy haciendo mal?


661
2017-12-04 22:56


origen


Respuestas:


Para responder a esta pregunta específicamente, hay dos problemas:

  1. $randstring no está en el alcance cuando lo haces eco.
  2. Los personajes no se concatenan juntos en el ciclo.

Aquí hay un fragmento de código con las correcciones:

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

Imprima la cadena aleatoria con la siguiente llamada:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

Tenga en cuenta que esto genera cadenas aleatorias predecibles. Si quieres crear tokens seguros, ver esta respuesta.


1157
2017-12-04 22:57



Nota: str_shuffle() internamente usa rand(), que no es adecuado para fines de criptografía (por ejemplo, generar contraseñas aleatorias). Quieres un generador seguro de números aleatorios en lugar. Tampoco permite que los personajes se repitan.

Una forma más

ACTUALIZADO  (ahora esto genera cualquier longitud de cadena):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

Eso es. :)


324
2017-11-03 20:04



Hay muchas respuestas a esta pregunta, pero ninguna de ellas aprovecha un Generador de números pseudoaleatorios criptográficamente seguro (CSPRNG).

La respuesta simple, segura y correcta es usar RandomLib y no reinventar la rueda.

Para aquellos de ustedes que insisten en inventar su propia solución, PHP 7.0.0 proporcionará random_int() para este propósito; si todavía está en PHP 5.x, escribimos un PHP 5 polyfill para random_int() para que pueda usar la nueva API incluso antes de actualizar a PHP 7.

Generación segura de enteros aleatorios en PHP no es una tarea trivial. Siempre debes consultar con sus expertos en criptografía StackExchange residentes antes de implementar un algoritmo local en producción.

Con un generador de enteros seguro en su lugar, generar una cadena aleatoria con un CSPRNG es una caminata en el parque.

Crear una cadena segura y aleatoria

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

Uso:

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

Manifestación: https://3v4l.org/b4PST (Ignore las fallas de PHP 5; necesita random_compat)


238
2018-06-29 03:41



Crea una cadena hexdec de 20 caracteres de largo:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

En PHP 7 (random_bytes ())

$string = base64_encode(random_bytes(10)); // ~14 chars
// or
$string = bin2hex(random_bytes(10)); // 20 chars

108
2017-09-04 18:25



@tasmaniski: tu respuesta funcionó para mí. Tuve el mismo problema, y ​​lo sugeriría para aquellos que siempre buscan la misma respuesta. Aquí es de @tasmaniski:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

75
2018-02-10 08:24



Dependiendo de su aplicación (quería generar contraseñas), podría usar

$string = base64_encode(openssl_random_pseudo_bytes(30));

Siendo base64, pueden contener = o - así como los personajes solicitados. Podrías generar una cadena más larga, luego filtrarla y recortarla para eliminarla.

openssl_random_pseudo_bytes parece ser la forma recomendada de generar un número aleatorio apropiado en php. Por qué rand no usa /dev/random No lo sé.


42
2018-02-06 17:40



Sé que esto puede ser un poco tarde para el juego, pero aquí hay un sencillo delineador de líneas que genera una verdadera cadena aleatoria sin ningún bucle de nivel de script o el uso de las bibliotecas de openssl.

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10);

Para descomponerlo, los parámetros son claros

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength);

Este método funciona repitiendo aleatoriamente la lista de caracteres, luego mezcla la cadena combinada y devuelve el número de caracteres especificado.

Puede aleatorizar aún más esto, aleatorizando la longitud de la cadena devuelta, reemplazando $chrRandomLength con mt_rand(8, 15) (para una cadena aleatoria de entre 8 y 15 caracteres).


25
2018-04-19 21:18



Una mejor forma de implementar esta función es:

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_rand es más aleatorio según esta y esta en php7. rand la función es un alias de mt_rand.


24
2017-09-24 18:08



function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

Tada!


22
2017-12-26 16:32