Advertisement
  1. Code
  2. PHP

Generar Cadenas Alfanuméricas Aleatorias en PHP

by
Read Time:10 minsLanguages:

Spanish (Español) translation by Jean Perez (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:

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.

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í!

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.

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:

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.

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:

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.

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