¿Cómo puedo generar una cadena alfanumérica (pseudo) aleatoria, algo como: 'd79jd8c' en PHP?
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.
strlen()
cada iteración no es bueno. Asignar strlen($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);
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));
}
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.
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:
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;
}
}
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
Tal vez me perdí algo aquí, pero aquí hay una forma de usar la función uniqid () .
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;
}
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);
}
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();
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.
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í.
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 ().
range('a','z');
1 línea:
$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;
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;
}
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.
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;
}
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
.