Как я могу сгенерировать (псевдо) случайную буквенно-цифровую строку, например: 'd79jd8c' в PHP?






Сначала сделайте строку со всеми возможными символами:
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
Вы также можете использовать классифицировать(), чтобы сделать это быстрее.
Затем в цикле выберите случайное число и используйте его в качестве индекса для строки $characters, чтобы получить случайный символ, и добавьте его в свою строку:
$string = '';
$max = strlen($characters) - 1;
for ($i = 0; $i < $random_string_length; $i++) {
$string .= $characters[mt_rand(0, $max)];
}
$random_string_length - длина случайной строки.
Эта реализация также удобна, если вы хотите удалить одинаковые символы, такие как «l» и «1», «O» и «0». Это полезно при создании новых паролей для пользователей.
Я также использую эту технику и удаляю все гласные, чтобы случайно не дать кому-нибудь что-нибудь грубое за пароль.
Вам не хватает закрывающих скобок после "- 1" и перед "]"
Выполнять strlen() на каждой итерации нехорошо. Назначьте strlen($characters) - 1 переменной и выполните strlen вне цикла. В данном случае не критично, но это просто Mauvais ton.
range определенно не стал бы делать это быстрее. Нет ничего быстрее, чем жестко запрограммированная строка из 36 символов.
Подумайте об использовании random_int, если вам нужен криптографически безопасный случайный.
какова вероятность получить повторяющуюся строку с этим кодом?
Используйте Таблица ASCII, чтобы выбрать диапазон букв, где: $ range_start, $ range_end - значение из десятичного столбца в таблице ASCII.
Я считаю, что этот метод лучше по сравнению с к описанному методу, где диапазон символов специально определен в другой строке.
// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end = 122;
$random_string = "";
$random_string_length = 10;
for ($i = 0; $i < $random_string_length; $i++) {
$ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range
// finds the character represented by $ascii_no and adds it to the random string
// study **chr** function for a better understanding
$random_string .= chr( $ascii_no );
}
echo $random_string;
Узнать больше:
Это хорошо, хотя не буквенно-цифровые символы попадают в диапазон ASCII.
Вы можете использовать следующий код. Это похоже на существующие функции, за исключением того, что вы можете принудительно подсчитать специальные символы:
function random_string() {
// 8 characters: 7 lower-case alphabets and 1 digit
$character_sets = [
["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"],
["count" => 1, "characters" => "0123456789"]
];
$temp_array = array();
foreach ($character_sets as $character_set) {
for ($i = 0; $i < $character_set["count"]; $i++) {
$random = random_int(0, strlen($character_set["characters"]) - 1);
$temp_array[] = $character_set["characters"][$random];
}
}
shuffle($temp_array);
return implode("", $temp_array);
}
Джереми ответил великолепно. Если, как и я, вы не знаете, как реализовать range (), вы можете увидеть мою версию с помощью range ().
<?php
$character_array = array_merge(range('a', 'z'), range(0, 9));
$string = "";
for($i = 0; $i < 6; $i++) {
$string .= $character_array[rand(0, (count($character_array) - 1))];
}
echo $string;
?>
Это делает то же самое, что и у Джереми, но использует объединенные массивы, где он использует строку, и использует count (), где он использует strlen ().
это должен быть range('a','z');
Может я что-то тут упустил, но вот способ использования функции uniqid ().
uniqid никоим образом не случайный. Это совершенно предсказуемо. Этот вопрос очень специфичен для поиска псевдослучайных строк.
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
echo generateRandomString();
Я знаю, что это старый пост, но я хотел бы внести свой вклад в созданный мной класс на основе ответа Джереми Рутена и улучшенный предложениями в комментариях:
class RandomString
{
private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
private static $string;
private static $length = 8; //default random string length
public static function generate($length = null)
{
if ($length){
self::$length = $length;
}
$characters_length = strlen(self::$characters) - 1;
for ($i = 0; $i < self::$length; $i++) {
self::$string .= self::$characters[mt_rand(0, $characters_length)];
}
return self::$string;
}
}
Мне нравится эта функция для работы
function randomKey($length) {
$pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));
for($i=0; $i < $length; $i++) {
$key .= $pool[mt_rand(0, count($pool) - 1)];
}
return $key;
}
echo randomKey(20);
Сгенерируйте криптографически стойкую случайную (потенциально) 8-символьную строку с помощью функции openssl_random_pseudo_bytes:
echo bin2hex(openssl_random_pseudo_bytes(4));
Процедурный способ:
function randomString(int $length): string
{
return bin2hex(openssl_random_pseudo_bytes($length));
}
Обновлять:
PHP7 представил функции random_x(), которые должны быть еще лучше. Если вы пришли с PHP 5.X, используйте отличную библиотеку paragonie / random_compat, которая представляет собой полифил для random_bytes () и random_int () из PHP 7.
function randomString($length)
{
return bin2hex(random_bytes($length));
}
Я сделал следующую быструю функцию, просто чтобы поиграть с функцией range(). Это просто может когда-нибудь помочь кому-то.
Function pseudostring($length = 50) {
// Generate arrays with characters and numbers
$lowerAlpha = range('a', 'z');
$upperAlpha = range('A', 'Z');
$numeric = range('0', '9');
// Merge the arrays
$workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha));
$returnString = "";
// Add random characters from the created array to a string
for ($i = 0; $i < $length; $i++) {
$character = $workArray[rand(0, 61)];
$returnString .= $character;
}
return $returnString;
}
Вот что я использую:
$cryptoStrong = true; // can be false
$length = 16; // Any length you want
$bytes = openssl_random_pseudo_bytes($length, $cryptoStrong);
$randomString = bin2hex($bytes);
Вы можете видеть Документы для openssl_random_pseudo_bytes здесь и Документы для bin2hex здесь
1 строка:
$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;
Однострочное решение:
echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );
Вы можете изменить параметр substr, чтобы установить другую длину для вашей строки.
Если вам нужен очень простой способ сделать это, вы можете положиться на существующие функции PHP. Это код, который я использую:
substr( sha1( time() ), 0, 15 )
time() дает вам текущее время в секундах с начала эпохи, sha1() шифрует его до строки 0-9a-f, а substr() позволяет вам выбрать длину. Вам не обязательно начинать с символа 0, и независимо от разницы между двумя числами, будет длина строки.
Современный способ сделать это с помощью типа hint / random_int для реальной случайности
function random_string(int $size): string
{
$characters = array_merge(
range(0, 9),
range('A', 'Z')
);
$string = '';
$max = count($characters) - 1;
for ($i = 0; $i < $size; $i++) {
$string .= $characters[random_int(0, $max)];
}
return $string;
}
Простые ребята .... но помните, что каждый байт случайный от 0 до 255, что для случайной строки будет нормально. Также помните, что у вас будет два символа для представления каждого байта.
$str = bin2hex(random_bytes(32)); // 64 character string returned
Безусловно, лучший ответ и самый короткий код! Это должно получить больше голосов
Сначала перечислите желаемых персонажей
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
Используйте функцию str_shuffle ($ string). Эта функция предоставит вам случайную перетасованную строку.
$alpha=substr(str_shuffle($chars), 0, 50);
50 - длина строки.
public function randomString($length = 8)
{
$characters = implode([
'ABCDEFGHIJKLMNOPORRQSTUWVXYZ',
'abcdefghijklmnoprqstuwvxyz',
'0123456789',
//'!@#$%^&*?'
]);
$charactersLength = strlen($characters) - 1;
$string = '';
while ($length) {
$string .= $characters[mt_rand(0, $charactersLength)];
--$length;
}
return $string;
}
У вас разное количество символов в строчных и прописных строках. И есть ли у этого кода какие-то преимущества перед всеми другими уже опубликованными здесь вариантами?
Решение короткое и уникальное. Ссылка на эту ссылку stackoverflow.com/a/34467730/4345141