Generación de cadenas alfanuméricas (pseudo) aleatorias

Respuestas:

164

Primero haz una cadena con todos tus caracteres posibles:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

También puede usar range () para hacer esto más rápidamente.

Luego, en un bucle, elija un número aleatorio y úselo como índice de la $characterscadena para obtener un carácter aleatorio y añádalo a su cadena:

 $string = '';
 $max = strlen($characters) - 1;
 for ($i = 0; $i < $random_string_length; $i++) {
      $string .= $characters[mt_rand(0, $max)];
 }

$random_string_length es la longitud de la cadena aleatoria.

Jeremy Ruten
fuente
9
Esta implementación también es buena si desea eliminar caracteres que tengan el mismo aspecto, como "l" y "1", "O" y "0". Esto es útil al generar nuevas contraseñas para los usuarios.
Mark Nold
10
También utilizo esta técnica y elimino todas las vocales para no darle accidentalmente a alguien algo grosero como contraseña.
nickf
10
Mejora menor: mt_rand()es un reemplazo directo rand()y es mejor.
Grilse
11
Ejecutar strlen()cada iteración no es bueno. Asignar strlen($characters) - 1a una variable y realizar strlen fuera del ciclo. No es crítico en este caso, pero es solo tonelada de Mauvais .
mintobit
6
Considere usar random_int si necesita un random criptográficamente seguro.
reallynice
18

Me gusta esta función para el trabajo

function randomKey($length) {
    $pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));

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

echo randomKey(20);
azerafati
fuente
14

Genere una cadena de 8 caracteres aleatoria (potencialmente) criptográficamente fuerte utilizando la función openssl_random_pseudo_bytes :

echo bin2hex(openssl_random_pseudo_bytes(4));

Forma procesal:

function randomString(int $length): string
{
    return bin2hex(openssl_random_pseudo_bytes($length));
}

Actualizar:

PHP7 introdujo las random_x()funciones que deberían ser aún mejores. Si viene de PHP 5.X, use una excelente biblioteca paragonie / random_compat que es un polyfill para random_bytes () y random_int () de PHP 7.

function randomString($length)
{
    return bin2hex(random_bytes($length));
}
emix
fuente
7

Solución de una línea:

echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );

Puede cambiar el parámetro substr para establecer una longitud diferente para su cadena.

Marco Panichi
fuente
4

Utilice la tabla ASCII para elegir un rango de letras, donde: $ range_start, $ range_end es un valor de la columna decimal en la tabla ASCII.

Encuentro que este método es más agradable en comparación con el método descrito donde el rango de caracteres se define específicamente dentro de otra cadena.

// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end   = 122;
$random_string = "";
$random_string_length = 10;

for ($i = 0; $i < $random_string_length; $i++) {
  $ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range
  // finds the character represented by $ascii_no and adds it to the random string
  // study **chr** function for a better understanding
  $random_string .= chr( $ascii_no );
}

echo $random_string;

Ver más:

Daniel
fuente
1
Esto es bueno, aunque los caracteres no alfanuméricos se encuentran dentro de ese rango ACSII.
Bower
4

Sé que es una publicación antigua, pero me gustaría contribuir con una clase que he creado en base a la respuesta de Jeremy Ruten y mejorado con sugerencias en los comentarios:

    class RandomString
    {
      private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
      private static $string;
      private static $length = 8; //default random string length

      public static function generate($length = null)
      {

        if($length){
          self::$length = $length;
        }

        $characters_length = strlen(self::$characters) - 1;

        for ($i = 0; $i < self::$length; $i++) {
          self::$string .= self::$characters[mt_rand(0, $characters_length)];
        }

        return self::$string;

      }

    }
diegoiglesias
fuente
3

Chicos simples ... pero recuerden que cada byte es aleatorio entre 0 y 255, lo que para una cadena aleatoria estará bien. También recuerde que tendrá dos caracteres para representar cada byte.

$str = bin2hex(random_bytes(32));  // 64 character string returned
David Young
fuente
¡De lejos, la mejor respuesta y el código más corto! Esto debería obtener más votos positivos
Sliq
2

He creado la siguiente función rápida solo para jugar con la range()función. Puede que en algún momento ayude a alguien.

Function pseudostring($length = 50) {

    // Generate arrays with characters and numbers
    $lowerAlpha = range('a', 'z');
    $upperAlpha = range('A', 'Z');
    $numeric = range('0', '9');

    // Merge the arrays
    $workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha));
    $returnString = "";

    // Add random characters from the created array to a string
    for ($i = 0; $i < $length; $i++) {
        $character = $workArray[rand(0, 61)];
        $returnString .= $character;
    }

    return $returnString;
}
Pedro
fuente
2

Puede utilizar el siguiente código. Es similar a las funciones existentes, excepto que puede forzar el recuento de caracteres especiales:

function random_string() {
    // 8 characters: 7 lower-case alphabets and 1 digit
    $character_sets = [
        ["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"],
        ["count" => 1, "characters" => "0123456789"]
    ];
    $temp_array = array();
    foreach ($character_sets as $character_set) {
        for ($i = 0; $i < $character_set["count"]; $i++) {
            $random = random_int(0, strlen($character_set["characters"]) - 1);
            $temp_array[] = $character_set["characters"][$random];
        }
    }
    shuffle($temp_array);
    return implode("", $temp_array);
}
Salman A
fuente
1
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
echo generateRandomString();
Molla Rasel
fuente
1

Si desea una forma muy fácil de hacer esto, puede apoyarse en las funciones PHP existentes. Este es el código que uso:

substr( sha1( time() ), 0, 15 )

time()le da la hora actual en segundos desde la época, la sha1()cifra en una cadena de 0-9a-f y le substr()permite elegir una longitud. No tiene que comenzar en el carácter 0, y cualquiera que sea la diferencia entre los dos números será la longitud de la cadena.

DiMono
fuente
0

La respuesta de Jeremy es genial. Si, como yo, no está seguro de cómo implementar range (), puede ver mi versión usando range ().

<?php
$character_array = array_merge(range('a', 'z'), range(0, 9));
$string = "";
    for($i = 0; $i < 6; $i++) {
        $string .= $character_array[rand(0, (count($character_array) - 1))];
    }
echo $string;
?>

Esto hace exactamente lo mismo que Jeremy, pero usa matrices fusionadas donde usa una cadena, y usa count () donde usa strlen ().

Josh Smith
fuente
2
tiene que serrange('a','z');
Mehdi Karamosly
0

1 línea:

$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;
HausO
fuente
0

La forma moderna de hacer eso con el tipo hint / rand_int para una verdadera randomeness

function random_string(int $size): string
{
    $characters = array_merge(
        range(0, 9),
        range('A', 'Z')
    );

    $string = '';
    $max = count($characters) - 1;
    for ($i = 0; $i < $size; $i++) {
        $string .= $characters[random_int(0, $max)];
    }

    return $string;
}
lyrixx
fuente
0

Primero enumere los caracteres deseados

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Utilice la función str_shuffle ($ string). Esta función le proporcionará una cadena aleatoria.

$alpha=substr(str_shuffle($chars), 0, 50);

50 es la longitud de la cuerda.

Shravan M
fuente
0
public function randomString($length = 8)
{
    $characters = implode([
        'ABCDEFGHIJKLMNOPORRQSTUWVXYZ',
        'abcdefghijklmnoprqstuwvxyz',
        '0123456789',
        //'!@#$%^&*?'
    ]);

    $charactersLength = strlen($characters) - 1;
    $string           = '';

    while ($length) {
        $string .= $characters[mt_rand(0, $charactersLength)];
        --$length;
    }

    return $string;
}
Александр Маринов
fuente
Tiene un número diferente de caracteres en cadenas de mayúsculas y minúsculas. ¿Y este código tiene alguna ventaja sobre todas las demás variantes ya publicadas aquí?
magras