Однострочный генератор случайных строк PHP?

Я ищу кратчайший способ генерации случайных/уникальных строк, и для этого я использовал следующие два:

$cClass = sha1(time());

или

$cClass = md5(time());

Однако мне нужно, чтобы строка начиналась с символа алфавита, я искал кодировку base64, но в конце добавлял ==, а затем мне нужно было избавиться от этого.

Каким будет лучший способ добиться этого с помощью одной строки кода?


Update:

PRNDL придумал хорошие предложения, которые я использовал, но немного изменил

echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)

Допустим 32 символа, имитирующие хеш файл md5, но он всегда будет обрабатывать первую char букву алфавита, например:

solution 1

Однако Uours действительно улучшился и его ответ;

substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);

короче и слаще

Другое предложение от Аноним2011 было очень удивительным, но по какой-то причине первый символ всегда был либо M, N, Y, Z, так и не соответствовал моим целям, но был бы выбранным ответом, кстати, кто-нибудь знает, почему он всегда будет давать эти конкретные письма?

Вот предварительный просмотр моей измененной версии

echo  rtrim(base64_encode(md5(microtime())),"=");

runner up

Ответ 1

Вместо того, чтобы перетасовывать строку алфавита, быстрее получить один случайный символ.

Получить один случайный символ из строки, а затем добавить к нему md5( time( ) ). Перед добавлением md5( time( ) ) удалите из него один символ, чтобы полученная длина строки составляла 32 символа:

substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 51), 1).substr(md5(time()), 1);

Строчная версия:

substr("abcdefghijklmnopqrstuvwxyz", mt_rand(0, 25), 1).substr(md5(time()), 1);

Или даже более короткая и чуть более быстрая версия в нижнем регистре:

chr(mt_rand(97, 122)).substr(md5(time()), 1);

/* or */

chr(mt_rand(ord('a'), ord('z'))).substr(md5(time()), 1);


Примечание для тех, кто пытается создать много случайных строк в течение секунды:
Поскольку time( ) возвращает время в секундах, md5( time( ) ) будет одинаковым в течение данной секунды времени, из-за чего, если в течение секунды было сгенерировано много случайных строк, они, вероятно, могли бы иметь некоторые дубликаты


Я проверил, используя приведенный ниже код. Это тестирует строчную версию:

    $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 );

Ответ 2

Я нашел что-то вроде этого:

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

Ответ 3

Если вам нужно, чтобы начать с письма, вы можете это сделать. Это грязно... но это одна линия.

$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);

echo $randomString;

Ответ 4

Я решил, что этот вопрос нуждается в лучшем ответе. Как код гольф! Это также использует лучший генератор случайных байтов.

preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));

Увеличьте количество байтов для более длинного пароля, очевидно.

Ответ 5

base_convert(microtime(true), 10, 36);

Ответ 6

Создает длинную шестнадцатеричную строку длиной 200 char:

$string = bin2hex(openssl_random_pseudo_bytes(100));

ответ maaarghk лучше.

Ответ 7

Я создал этот код для вас. Простой, короткий и (резонно) элегантный.

Это использует base64, как вы упомянули, если длина не важна для вас - однако он удаляет "==" с помощью str_replace.

<?php
        echo  str_ireplace("==", "", base64_encode(time()));
?>

Ответ 8

Вы можете попробовать следующее:

 function KeyGenerator($uid) {
    $tmp = '';
    for($z=0;$z<5;$z++) {
      $tmp .= chr(rand(97,122)) . rand(0,100);
    }
    $tmp .= $uid;
    return $tmp;
  }

Ответ 9

Я использую эту функцию

использование:

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

Ответ 10

Я использую этот метод для создания десятков уникальных строк за один раз, не повторяя их, на основе других хороших примеров выше:

$string = chr(mt_rand(97, 122))
          . substr(md5(str_shuffle(time() . rand(0, 999999))), 1);

Таким образом, я смог создать 1.000.000 уникальных строк за ~ 5 секунд. Это не так быстро, я знаю, но поскольку мне просто нужно несколько из них, я в порядке с ним. Кстати, генерация 10 строк заняла менее 0,0001 мс.

Ответ 11

Решение для 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: Создать случайную строку с использованием JavaScript

Решение 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: Сгенерировать случайную строку с помощью PHP

Ответ 12

Эта функция возвращает случайную строчную строку:

function randomstring($len=10){
 $randstr='';
 for($iii=1; $iii<=$len; $iii++){$randstr.=chr(rand(97,122));};
 return($randstr);
};

Ответ 13

Я нахожу, что кодировка base64 полезна для создания случайных строк и использует эту строку:

base64_encode(openssl_random_pseudo_bytes(9));

Он дает мне случайную строку из 12 позиций, с дополнительным преимуществом, что случайность "криптографически сильная".

Ответ 14

для генерации строк состоит из случайных символов, вы можете использовать эту функцию

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

Ответ 15

Это действительно зависит от ваших требований.

Мне нужны строки, чтобы быть уникальными между тестовыми запусками, но не так много других ограничений.

Мне также понадобилась моя строка, чтобы начать с персонажа, и это было достаточно хорошо для моей цели.

$mystring = "/a" . microtime(true);

Пример вывода:

a1511953584.0997

Ответ 16

Как соответствовать оригинальному запросу OPs ужасным образом (расширен для удобства чтения):

// [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, '.'))));

Один из последних array_fill() изменит '7' на вашу длину - 1.

Для того, кто делает все буквенно-цифровые (и все еще медленно):

// [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, '.')));