Je cherche le moyen le plus rapide de générer des chaînes aléatoires/uniques et pour cela, j’utilisais les deux méthodes suivantes:
$cClass = sha1(time());
ou
$cClass = md5(time());
Cependant, j'ai besoin que la chaîne commence par un caractère alphabétique, je cherchais un encodage en base64, mais cela ajoute ==
à la fin, puis il faudrait que je m'en débarrasse.
Quel serait le meilleur moyen d'y parvenir avec une seule ligne de code?
Mettre à jour:
PRNDL a proposé de bonnes suggestions, mais je les ai utilisées mais un peu modifiées
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
Céderait 32 caractères imitant le hachage md5 mais produirait toujours le premier caractère une lettre alphabétique, comme ceci;
Cependant, Uours vraiment amélioré sur et sa réponse;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
est plus court et plus doux
L’autre suggestion de Anonymous2011 était très impressionnante, mais le premier personnage, pour une raison quelconque, serait toujours soit M, N, Y, Z, donc ne correspondait pas à mes objectifs, mais aurait été la réponse choisie. céder ces lettres particulières?
Voici l'aperçu de ma version modifiée
echo rtrim(base64_encode(md5(microtime())),"=");
Plutôt que de mélanger la chaîne de l'alphabet, il est plus rapide d'obtenir un seul caractère aléatoire .
Obtenez un seul caractère aléatoire de la chaîne, puis ajoutez-y la md5( time( ) )
. Avant d’ajouter md5( time( ) )
, supprimez-en un pour conserver la longueur de chaîne résultante à 32 caractères:
substr( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,mt_Rand( 0 ,51 ) ,1 ) .substr( md5( time() ), 1)
Version minuscule:
substr( "abcdefghijklmnopqrstuvwxyz" ,mt_Rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 )
Ou même en version minuscule un peu plus rapide et un peu plus rapide:
chr( mt_Rand( 97 ,122 ) ) .substr( md5( time( ) ) ,1 )
/* or */
chr( mt_Rand( ord( 'a' ) ,ord( 'z' ) ) ) .substr( md5( time( ) ) ,1 )
Une note à tous ceux qui essaient de générer plusieurs chaînes aléatoires en une seconde:
Étant donné que time( )
renvoie le temps en secondes, md5( time( ) )
sera identique pendant une seconde donnée, de sorte que si plusieurs chaînes aléatoires étaient générées au cours d'une seconde, elles pourraient probablement finir quelques doublons.
J'ai testé en utilisant le code ci-dessous. Ceci teste la version en minuscule:
$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 );
J'avais trouvé quelque chose comme ça:
$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
Si vous en avez besoin pour commencer par une lettre, vous pouvez le faire. C'est désordonné ... mais c'est une ligne.
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
echo $randomString;
J'ai décidé que cette question avait besoin d'une meilleure réponse. J'aime le code golf! Cela utilise également un meilleur générateur d'octets aléatoires.
preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));
Augmentez le nombre d'octets pour un mot de passe plus long, évidemment.
Crée une chaîne hexdec longue de 200 caractères:
$string = bin2hex(openssl_random_pseudo_bytes(100));
La réponse de maaarghk est meilleure cependant.
J'ai généré ce code pour vous. Simple, court et (apparemment) élégant.
Ceci utilise le base64 comme vous l'avez mentionné, si la longueur n'est pas importante pour vous - Cependant, elle supprime le "==" en utilisant str_replace.
<?php
echo str_ireplace("==", "", base64_encode(time()));
?>
Vous pouvez essayer ceci:
function KeyGenerator($uid) {
$tmp = '';
for($z=0;$z<5;$z++) {
$tmp .= chr(Rand(97,122)) . Rand(0,100);
}
$tmp .= $uid;
return $tmp;
}
J'utilise cette fonction
usage:
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;
}
pour générer des chaînes composées de caractères aléatoires, vous pouvez utiliser cette fonction
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;
}
J'utilise celui-ci pour générer des dizaines de chaînes uniques en une fois, sans les répéter, sur la base d'autres bons exemples ci-dessus:
$string = chr(mt_Rand(97, 122))
. substr(md5(str_shuffle(time() . Rand(0, 999999))), 1);
De cette façon, j'ai pu générer 1 000 000 chaînes uniques en environ 5 secondes. Ce n'est pas si rapide, je sais, mais comme j'en ai juste besoin d'une poignée, ça me va. Soit dit en passant, générer 10 chaînes prenait moins de 0,0001 ms.
Je trouve que l'encodage en base64 est utile pour créer des chaînes aléatoires, et utilise cette ligne:
base64_encode(openssl_random_pseudo_bytes(9));
Cela me donne une chaîne aléatoire de 12 positions, avec l'avantage supplémentaire que l'aléa est "cryptographiquement fort".
Cette fonction retourne une chaîne minuscule aléatoire:
function randomstring($len=10){
$randstr='';
for($iii=1; $iii<=$len; $iii++){$randstr.=chr(Rand(97,122));};
return($randstr);
};
Solution 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 référence: Générer une chaîne aléatoire à l'aide de JavaScript
PHP Solution:
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 référence: Génère une chaîne aléatoire à l'aide de PHP
Comment faire pour correspondre à la demande d'origine OPs d'une manière horrible (élargi pour la lisibilité):
// [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, '.'))));
Un dernier tableau, array_fill () changerait le '7' en votre longueur - 1.
Pour celui qui fait tout alpha-nurmeric (Et toujours lent):
// [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, '.')));