Я ищу кратчайший способ генерации случайных / уникальных строк, и для этого я использовал следующие два:
$cClass = sha1(time());
или
$cClass = md5(time());
Тем не менее, мне нужна строка, чтобы начать с символа алфавита, я искал кодировку base64, но добавляет ==
в конце, а затем мне нужно будет избавиться от этого.
Какой был бы лучший способ добиться этого с помощью одной строки кода?
Обновить:
PRNDL придумал хорошие предложения, которые я в конечном итоге использовал, но немного изменил
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
Будет приводить 32 символа, имитирующих хеш-память md5, но всегда будет обрабатывать первый символ буквой алфавита, например;
Тем не менее, Uours действительно улучшился и его ответ;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
короче и слаще
Другое предложение Anonymous2011 было очень удивительным, но первый символ по какой-то причине всегда был либо M, N, Y, Z, так и не соответствовал моим целям, но был бы выбранным ответом, кстати, кто-нибудь знает, почему он всегда будет давать эти конкретные буквы ?
Вот предварительный просмотр моей измененной версии
echo rtrim(base64_encode(md5(microtime())),"=");
Вместо того, чтобы перетасовывать строку алфавита, быстрее получить один случайный символ.
Получите один случайный символ из строки, а затем добавьте к нему 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