El método Random::alphanumericString($length)hace lo que quieres. Si desea construir esto usted mismo, no use ninguna fuente aleatoria que no sea la incorporada de PHP random_byteso random_int.
caw
Respuestas:
164
Primero haz una cadena con todos tus caracteres posibles:
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.
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;
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:
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
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.
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í?
Random::alphanumericString($length)
hace lo que quieres. Si desea construir esto usted mismo, no use ninguna fuente aleatoria que no sea la incorporada de PHPrandom_bytes
orandom_int
.Respuestas:
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
$characters
cadena 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.fuente
mt_rand()
es un reemplazo directorand()
y es mejor.strlen()
cada iteración no es bueno. Asignarstrlen($characters) - 1
a una variable y realizar strlen fuera del ciclo. No es crítico en este caso, pero es solo tonelada de Mauvais .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);
fuente
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)); }
fuente
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.
fuente
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:
fuente
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; } }
fuente
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
fuente
Tal vez me perdí algo aquí, pero aquí hay una forma de usar la función uniqid () .
fuente
uniqid
no es aleatorio de ninguna manera. Es completamente predecible. Esta pregunta busca muy específicamente cadenas pseudoaleatorias.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; }
fuente
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); }
fuente
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();
fuente
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, lasha1()
cifra en una cadena de 0-9a-f y lesubstr()
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.fuente
Esto es algo que uso:
$cryptoStrong = true; // can be false $length = 16; // Any length you want $bytes = openssl_random_pseudo_bytes($length, $cryptoStrong); $randomString = bin2hex($bytes);
Puede ver los documentos de openssl_random_pseudo_bytes aquí y los documentos de bin2hex aquí.
fuente
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 ().
fuente
range('a','z');
1 línea:
$FROM = 0; $TO = 'zzzz'; $code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36); echo $code;
fuente
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; }
fuente
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.
fuente
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