number - php randomize
Una lĂnea de generador de cuerdas al azar de PHP? (16)
Cómo hacer coincidir la solicitud original de OP de una manera horrible (expandida para facilitar la lectura):
// [0-9] ASCII DEC 48-57
// [A-Z] ASCII DEC 65-90
// [a-z] ASCII DEC 97-122
// Generate: [A-Za-z][0-9A-Za-z]
$r = implode("", array_merge(array_map(function($a)
{
$a = [rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 1, ''.'')),
array_map(function($a)
{
$a = [rand(48, 57), rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 7, ''.''))));
Uno de los últimos array_fill () cambiaría el ''7'' a su longitud - 1.
Para uno que hace todos los alfa-numéricos (y aún lento):
// [0-9A-Za-z]
$x = implode("", array_map(function($a)
{
$a = [rand(48, 57), rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 8, ''.'')));
Estoy buscando la forma más corta de generar cadenas aleatorias / únicas y para eso estaba usando las siguientes dos:
$cClass = sha1(time());
o
$cClass = md5(time());
Sin embargo, necesito que la cadena comience con un carácter alfabético, estaba buscando la codificación base64 pero eso agrega ==
al final y luego tendría que deshacerme de eso.
¿Cuál sería la mejor manera de lograr esto con una línea de código?
Actualizar:
PRNDL presentó una buena sugerencia que terminé usándola pero un poco modificada
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
Otorgaría 32 caracteres que imitaran el hash md5, pero siempre produciría el primer carácter y una letra del alfabeto, como tal;
Sin embargo, Uours realmente mejoró y su respuesta;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
es más corto y más dulce
La otra sugerencia de Anonymous2011 fue muy impresionante, pero el primer personaje por alguna razón siempre M, N, Y, Z no encajaba en mis propósitos, pero hubiera sido la respuesta elegida, por cierto alguien sabe por qué siempre daría esas letras en particular. ?
Aquí está la vista previa de mi versión modificada
echo rtrim(base64_encode(md5(microtime())),"=");
Crea una cadena hexdec larga de 200 caracteres:
$string = bin2hex(openssl_random_pseudo_bytes(100));
La respuesta de maaarghk es mejor.
Decidí que esta pregunta necesita una mejor respuesta. Como el código de golf! Esto también usa un mejor generador de bytes aleatorios.
preg_replace("/[//=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));
Aumente el número de bytes para una contraseña más larga, obviamente.
En lugar de mezclar la secuencia del alfabeto, es más rápido obtener un solo carácter aleatorio.
Obtenga un único carácter aleatorio de la cadena y luego agregue el md5( time( ) )
a él. Antes de agregar md5( time( ) )
elimine un carácter de este para mantener la longitud de la cadena resultante en 32 caracteres:
substr( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,mt_rand( 0 ,51 ) ,1 ) .substr( md5( time() ), 1)
Versión en minúsculas:
substr( "abcdefghijklmnopqrstuvwxyz" ,mt_rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 )
O incluso una versión en minúscula más corta y un poco más rápida:
chr( mt_rand( 97 ,122 ) ) .substr( md5( time( ) ) ,1 )
/* or */
chr( mt_rand( ord( ''a'' ) ,ord( ''z'' ) ) ) .substr( md5( time( ) ) ,1 )
Una nota para cualquiera que intente generar muchas cadenas aleatorias en un segundo:
Como time( )
devuelve el tiempo en segundos, md5( time( ) )
será el mismo a lo largo de un segundo dado debido a que si se generan muchas cadenas aleatorias dentro de un segundo de tiempo, es probable que éstas terminen teniendo alguna duplicados
He probado usando el código a continuación. Esto prueba la versión en minúsculas:
$num_of_tests = 100000;
$correct = $incorrect = 0;
for( $i = 0; $i < $num_of_tests; $i++ )
{
$rand_str = substr( "abcdefghijklmnopqrstuvwxyz" ,mt_rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 );
$first_char_of_rand_str = substr( $rand_str ,0 ,1 );
if( ord( $first_char_of_rand_str ) < ord( ''a'' ) or ord( $first_char_of_rand_str ) > ord( ''z'' ) )
{
$incorrect++;
echo $rand_str ,''<br>'';
}
else
{
$correct++;
}
}
echo ''Correct: '' ,$correct ,'' . Incorrect: '' ,$incorrect ,'' . Total: '' ,( $correct + $incorrect );
Encontré algo como esto:
$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
Encuentro que la codificación de base64 es útil para crear cadenas aleatorias y usar esta línea:
base64_encode(openssl_random_pseudo_bytes(9));
Me da una cadena aleatoria de 12 posiciones, con el beneficio adicional de que la aleatoriedad es "criptográficamente fuerte".
Esta función devuelve una cadena aleatoria en minúscula:
function randomstring($len=10){
$randstr='''';
for($iii=1; $iii<=$len; $iii++){$randstr.=chr(rand(97,122));};
return($randstr);
};
Estoy usando este para generar docenas de cadenas únicas de una sola vez, sin repetirlas, en base a otros buenos ejemplos anteriores:
$string = chr(mt_rand(97, 122))
. substr(md5(str_shuffle(time() . rand(0, 999999))), 1);
De esta forma, pude generar 1.000.000 de cadenas únicas en ~ 5 segundos. No es tan rápido, lo sé, pero como solo necesito un puñado de ellos, estoy de acuerdo. Por cierto, generar 10 cadenas tomó menos de 0.0001 ms.
He generado este código para ti. Simple, corto y (resonably) elegante.
Utiliza la base64 como mencionaste, si la longitud no es importante para ti. Sin embargo, elimina el "==" usando str_replace.
<?php
echo str_ireplace("==", "", base64_encode(time()));
?>
Puedes intentar esto:
function KeyGenerator($uid) {
$tmp = '''';
for($z=0;$z<5;$z++) {
$tmp .= chr(rand(97,122)) . rand(0,100);
}
$tmp .= $uid;
return $tmp;
}
Realmente depende de tus requisitos.
Necesitaba que las cadenas fueran únicas entre ejecuciones de prueba, pero no muchas otras restricciones.
También necesitaba mi cuerda para comenzar con un personaje, y esto fue lo suficientemente bueno para mi propósito.
$mystring = "/a" . microtime(true);
Ejemplo de salida:
a1511953584.0997
Si necesita que comience con una carta, puede hacer esto. Es desordenado ... pero es una línea.
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
echo $randomString;
Yo uso esta función
uso:
echo randomString(20, TRUE, TRUE, FALSE);
/**
* Generate Random String
* @param Int Length of string(50)
* @param Bool Upper Case(True,False)
* @param Bool Numbers(True,False)
* @param Bool Special Chars(True,False)
* @return String Random String
*/
function randomString($length, $uc, $n, $sc) {
$rstr='''';
$source = ''abcdefghijklmnopqrstuvwxyz'';
if ($uc)
$source .= ''ABCDEFGHIJKLMNOPQRSTUVWXYZ'';
if ($n)
$source .= ''1234567890'';
if ($sc)
$source .= ''|@#~$%()=^*+[]{}-_'';
if ($length > 0) {
$rstr = "";
$length1= $length-1;
$input=array(''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j,''''k'',''l'',''m'',''n'',''o'',''p'',''q'',''r'',''s'',''t'',''u'',''v'',''w'',''x'',''y'',''z'')
$rand = array_rand($input, 1)
$source = str_split($source, 1);
for ($i = 1; $i <= $length1; $i++) {
$num = mt_rand(1, count($source));
$rstr1 .= $source[$num - 1];
$rstr = "{$rand}{$rstr1}";
}
}
return $rstr;
}
para generar cadenas consta de caracteres aleatorios, puede usar esta función
public function generate_random_name_for_file($length=50){
$key = '''';
$keys = array_merge(range(0, 9), range(''a'', ''z''));
for ($i = 0; $i < $length; $i++) {
$key .= $keys[array_rand($keys)];
}
return $key;
}
base_convert(microtime(true), 10, 36);
Solución de JavaScript:
function randomString(pIntLenght) {
var strChars = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz”;
var strRandomstring = ”;
for (var intCounterForLoop=0; intCounterForLoop < pIntLenght; intCounterForLoop++) {
var rnum = Math.floor(Math.random() * strChars.length);
strRandomstring += strChars.substring(rnum,rnum+1);
}
return strRandomstring;
}
alert(randomString(20));
URL de referencia: genere cadenas aleatorias usando JavaScript
Solución de PHP:
function getRandomString($pIntLength = 30) {
$strAlphaNumericString = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;
$strReturnString = ”;
for ($intCounter = 0; $intCounter < $pIntLength; $intCounter++) {
$strReturnString .= $strAlphaNumericString[rand(0, strlen($strAlphaNumericString) - 1)];
}
return $strReturnString;
}
echo getRandomString(20);
URL de referencia: generar cadena aleatoria utilizando PHP