web-dev-qa-db-fra.com

Une ligne PHP générateur de chaîne aléatoire?

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;

solution 1

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())),"=");

runner up

37
J.D

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 );
29
Uours

J'avais trouvé quelque chose comme ça:

$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
26
23kulpamens

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.

5
maaarghk

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.

4
Rudie

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()));
?>
3
RobAtStackOverflow

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;
  }
3
Saud Khan

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;
  }
2
Emilio Gort

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;
}
1
Salar

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.

1
charlesrockbass

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

1
Bex

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);
};
1
PavelŠ

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

1

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, '.')));
0
EllisGL