Advertisement
  1. Code
  2. PHP
  3. PHP Scripts

Generar Cadenas Alfanuméricas Aleatorias en PHP

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

Quisiera empezar este post diciendo que casi ningún caso es verdaderamente al azar. Del resultado de un sorteo clásico podría en teoría puede predecir si conocía el efecto de cada factor implicado, como fricción, gravedad y la fuerza inicial del aire.

Lo mismo es aplicable a la generación de números aleatorios y cadenas alfanuméricas. Lo mejor que podemos esperar es generar números y cadenas que no parecen seguir un patrón y no se puede predecir prácticamente por un atacante.

En este tutorial cubriremos diferentes técnicas para generar números aleatorios y cadenas alfanuméricas en PHP. Algunos de ellos será criptográficamente seguras, mientras que otros están destinados sólo para uso ocasional, como asignación de nombres de archivo pseudoaleatorio o crear URLs y sugiriendo nombres de usuario.

Generar Números Aleatorios en PHP

Hay tres diferentes funciones para generar números aleatorios en PHP. Todos ellos aceptarán un mínimo y máximo valor posible para los números al azar y de la salida un número al azar para usted. Estos son rand($min, $max)mt_rand($min, $max), y random_int($min, $max).

Con rand(), los valores mínimos y máximos de enteros que puede generar mienten entre el 0 y el valor devuelto por getrandmax(). Antes de PHP 7.1.0, esta función fue aproximadamente cuatro veces más lenta que mt_rand(). Sin embargo, a partir de PHP 7.1.0, se ha realizado un alias de mt_rand(). A diferencia de mt_rand(), sin embargo, puede establecer el valor de $max sea menor que $min sin causar un error.

Con mt_rand(), los valores mínimos y máximos de enteros que puede generar mienten entre el 0 y el valor devuelto por mt_getrandmax(). Se basa en una puesta en práctica de Mersenne Twister para generar números aleatorios. Cuidado, sin embargo, antes de PHP 7.1.0, esta función implementa una versión incorrecta del algoritmo para generar los números. Sin embargo, se ha corregido en versiones más recientes.

La función se convirtió en incluso mejor en PHP 7.2.0 deshaciéndose de un modulo error de sesgo. Esto significa que para algunas semillas de particular, la secuencia de números al azar ahora será un poco mejor comparado a más viejas versiones. Código especializado podría realmente dependen de este sesgo, sin embargo. Si es así, puede utilizar el algoritmo de semilla más llamando a la función mt_srand() para el generador de números aleatorios de la semilla y pasando MT_RAND_PHP como el valor del segundo parámetro.

La función mt_rand() tiene un período de 219937−1, que significa básicamente que en escenarios de caso mejor consigues tantos como números aleatorios 219937−1 antes de repetir la secuencia. Debe tener en cuenta que la repetición de una secuencia no es lo mismo como repetición de un determinado número. En otras palabras, es posible que dos veces el mismo número al azar, pero eso no significa que la secuencia sí mismo ha comenzado a repetir. La siguiente secuencia es un ejemplo:

1
187 3276 1267 15 1267 34598 3467 125 17

En la secuencia anterior, tuvimos 1267 dos veces en la salida, pero eso no significa que toda la secuencia comenzó repitiendo después de eso. Es poco probable conseguir el mismo número repetido tan pronto en una secuencia al azar, pero es posible!

Números Enteros Aleatorios Criptográficamente Seguros

Si desea números pseudo-random cryptographically seguros, la función random_int() en PHP es su mejor apuesta. Genera números aleatorios entre el proporcionado valores $min y $max, que por defecto PHP_INT_MIN y PHP_INT_MAX. Lamentablemente, esta función sólo está disponible a partir de PHP 7.0. Para las versiones antes de eso, puede usar este polyfill en GitHub.

Flota al Azar

En lugar de generar números aleatorios enteros, también puede generar los flotadores. Esto puede hacerse sin esfuerzo, simplemente dividiendo un número aleatorio con un valor devuelto por mt_getrandmax(). En el siguiente ejemplo ilustrará cómo generar un float al azar entre 0 y 1 o entre cualquier otro mínimo y máximos.

1
<?php
2
3
// Output: 0.69458310943776

4
echo mt_rand(0, mt_getrandmax())/mt_getrandmax();
5
6
function mt_random_float($min, $max) {
7
    $float_part = mt_rand(0, mt_getrandmax())/mt_getrandmax();
8
    $integer_part = mt_rand($min, $max - 1);
9
    return $integer_part + $float_part;
10
}
11
12
// Output: 10.199064863938

13
echo mt_random_float(10, 11);
14
15
// Output: 35.540808309121

16
echo mt_random_float(15, 50);
17
18
?>

Al generar un float al azar entre límites teniendo en cuenta, nos aseguramos de que el número entero aleatorio no va encima $max - 1. Esta manera, podemos estar seguros de que agregando la parte del flotador no tendrá el número por encima del límite máximo.

Siembra los Generadores de Números Aleatorios

Un concepto que necesita un poco de explicación es semillas. En pocas palabras, estos son sólo números que pueden utilizarse para inicializar las funciones rand() y mt_rand() antes de generar cualquier número al azar. La función rand() de semillas se llama srand($seed), y la función que las semillas de mt_rand() se llama mt_srand ($seed, $mode).

Es importante recordar que un valor inicial de la semilla cada vez antes de llamar a rand() y mt_rand() no produce necesariamente más números aleatorios. De hecho, usando la misma semilla cada vez que le dará el mismo número aleatorio así!

1
<?php
2
3
mt_srand(10);
4
// Output: 1656398468

5
echo mt_rand();
6
7
mt_srand(10);
8
// Output: 1656398468

9
echo mt_rand();
10
11
mt_srand(10);
12
// Output: 1656398468

13
echo mt_rand();
14
15
?>

Sembrar un número al azar es útil en situaciones donde desea generar una secuencia al azar pero reproducible. El siguiente fragmento de código genera la misma secuencia de números al azar cuando se ejecuta dos veces.

1
<?php
2
3
mt_srand(10);
4
5
$count = 0;
6
7
while($count < 10) {
8
    echo mt_rand(0, 100)." ";
9
    $count++;
10
}
11
12
// Output on First Run:

13
// 68 58 68 13 3 48 30 37 96 82

14
15
// Output on Second Run:

16
// 68 58 68 13 3 48 30 37 96 82

Generar secuencias aleatorias reproducibles de esta manera puede ayudar a depurar los programas que se probaron con datos aleatorios, si hacer un seguimiento de la semilla, puede reproducir la misma entrada para averiguar lo que salió mal.

Generar Cadenas Alfanuméricas Aleatorias en PHP

Hay muchas maneras de generar cadenas alfanuméricas aleatorias, y lo que se utiliza dependerá de sus necesidades.

Generar Cadenas Barajan

Si desea generar cadenas alfanuméricas aleatorias de un conjunto fijo de caracteres, puede utilizar la función str_shuffle($string). Esta función le dará una cadena al azar aleatorio. A partir de PHP 7.1, el algoritmo que determina el orden aleatorio de caracteres en la cadena de salida ha sido cambiado a Mersenne Twister.

Recuerde que la cadena aleatoria generada de esta manera no es criptográficamente segura. Sin embargo, la cadena seguirá siendo bastante impredecible para uso común como generar nombres de archivo aleatorio o URLs. Aquí están algunos ejemplos:

1
<?php
2
3
$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyz';
4
// Output: 54esmdr0qf

5
echo substr(str_shuffle($permitted_chars), 0, 10);
6
7
$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
8
// Output: video-g6swmAP8X5VG4jCi.mp4

9
echo 'video-'.substr(str_shuffle($permitted_chars), 0, 16).'.mp4';
10
11
?>

Su salida será probablemente diferente en ambos casos. En el primer caso, sólo barajan la cadena de caracteres permitidos y luego tomaron los primero 10 caracteres del mismo. En el segundo caso, hemos añadido "video" al principio de la cadena generada y "MP4" en el final.

Este método de generación de cadenas alfanuméricas aleatorias es muy fácil, pero tiene un par de temas. Por ejemplo, nunca te los mismos caracteres en la cadena aleatoria dos veces. También, la longitud de la cadena de producción al azar sólo puede ser tan larga como la cadena de entrada.

Generar Cadenas Aleatorias

Si los problemas que enumerados anteriormente son un interruptor, puede mirar algunas otras implementaciones. El siguiente código va a resolver ambos problemas.

1
<?php
2
3
$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
4
5
function generate_string($input, $strength = 16) {
6
    $input_length = strlen($input);
7
    $random_string = '';
8
    for($i = 0; $i < $strength; $i++) {
9
        $random_character = $input[mt_rand(0, $input_length - 1)];
10
        $random_string .= $random_character;
11
    }
12
13
    return $random_string;
14
}
15
16
// Output: iNCHNGzByPjhApvn7XBD

17
echo generate_string($permitted_chars, 20);
18
19
// Output: 70Fmr9mOlGID7OhtTbyj

20
echo generate_string($permitted_chars, 20);
21
22
// Output: Jp8iVNhZXhUdSlPi1sMNF7hOfmEWYl2UIMO9YqA4faJmS52iXdtlA3YyCfSlAbLYzjr0mzCWWQ7M8AgqDn2aumHoamsUtjZNhBfU

23
echo generate_string($permitted_chars, 100);
24
25
?>

Se puede modificar para agregar particular sufijos y prefijos a la cadena aleatoria generada. Personas que están usando PHP 7 pueden mejorar aún más la generación de cadena mediante la función criptográficamente seguro random_int() en lugar de mt_rand ().

Generar Cadenas Hexadecimales al Azar

Si usted quiere generar cadenas hexadecimales aleatorios en PHP, también puede utilizar bien el md5($string, $raw_output) o el sha1($string, $raw_output) la función. Ambos de ellos generará algoritmos hash de una cadena de entrada dada.

Se siguen saliendo hash único como la entrada es única. Esto podría lograrse mediante el uso de la salida de una función como time() como entrada. De forma predeterminada, md5() devolverá una cadena hexadecimal de 32 caracteres y sha1() regresará una cadena hexadecimal de 40 caracteres. Estos pueden cortarse a una longitud específica utilizando la función substr().

Aquí está un ejemplo de salida devuelto por estas funciones:

1
<?php
2
3
// Output: 36e5e490f14b031e

4
echo substr(md5(time()), 0, 16);
5
6
// Output: aa88ef597c77a5b3

7
echo substr(sha1(time()), 0, 16);
8
9
// Output: 447c13ce896b820f353bec47248675b3

10
echo md5(time());
11
12
// Output: 6c2cef9fe21832a232da7386e4775654b77c7797

13
echo sha1(time());
14
15
?>

Como se puede ver, generando cadenas hexadecimales aleatorias y únicas hasta 40 caracteres de largo es muy fácil en PHP.

Generar Cadenas Aleatorios Criptográficamente Seguros

Las tres funciones para generar cadenas alfanuméricas aleatorias que hemos discutido hasta ahora no son criptográficamente seguras. Por suerte, PHP también tiene una función denominada random_bytes($length) para generar bytes pseudo-aleatorios criptográficamente seguros. El parámetro $length determina cuánto debe ser la cadena de salida.

Una vez que la salida en términos de bytes aleatorios, puede utilizar la función bin2hex() para convertir a valores hexadecimales. Esto será el doble de la longitud de la cadena.

1
<?php
2
3
// Output: b7b33efa07915b60ad55

4
echo bin2hex(random_bytes(10));
5
6
// Output: a2e6cb1f25616324c8a11a2cceb0b47c590949ea

7
echo bin2hex(random_bytes(20));
8
9
// Output: 25af3b86e11884ef5e8ef70a0ad06cba81b89ed6af3781a0

10
echo bin2hex(random_bytes(24));
11
12
?>

Otra función que puede utilizar para generar bytes aleatorios criptográficamente seguros es openssl_random_pseudo_bytes($length & $crypto_strong). El valor del segundo parámetro puede utilizarse para determinar si la secuencia de salida se genera mediante un algoritmo de cifrado seguro o no.

Reflexiones Finales

En este tutorial, analizamos la generación de números aleatorios y cadenas alfanuméricas en PHP. Generación de números aleatorios puede ser útil en una variedad de situaciones, como en los juegos donde tienes que spawn jugadores enemigos o al azar dar a los usuarios algunas pistas sobre las letras así que pueden formar una palabra completa.

Al igual que números al azar, la generación de cadenas alfanuméricas aleatorias también puede ser bastante útil en muchas circunstancias. Con la ayuda de str_shuffle(), usted puede elegir qué conjunto de caracteres aparecen en las cadenas al azar. Con sha1() y md5(), fácilmente puede generar secuencias hexadecimales al azar, y con random_bytes() pueden generar cadenas criptográficamente seguros. Esto le permitirá generar significativas al azar los nombres de archivo y nombres de usuarios que son difíciles de adivinar.

Espero que hayas disfrutado este tutorial. Si usted tiene cualesquiera preguntas, sienta libre de preguntar en los comentarios.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.