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.


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);

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));
}

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.


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:


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;

      }

    }

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

¡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;
}

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);
}

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();

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.



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 ().


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;

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;
}

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.


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;
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.