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

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

$cClass = sha1(time()); 

или

 $cClass = md5(time()); 

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

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


Обновить:

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

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

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

решение 1

Тем не менее, Uours действительно улучшился и его ответ;

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

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

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

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

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

занявший второе место

Solutions Collecting From Web of "Однострочный генератор случайных строк PHP?"

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

Получите один случайный символ из строки, а затем добавьте к нему 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 ); 

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

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

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

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

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

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

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

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

Создает строку с шестнадцатеричным длинным 200 символов:

 $string = bin2hex(openssl_random_pseudo_bytes(100)); 

Однако ответ maaarghk лучше.

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

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

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

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

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

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

Применение:

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

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

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

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

Решение 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

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

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

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

 base64_encode(openssl_random_pseudo_bytes(9)); 

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

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

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

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

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

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

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

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

a1511953584.0997