Однострочный генератор случайных строк 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, '.')));