Случайное имя на PHP символьное буквенное числовое значение

Итак эта статья будет о том как создать буквенно-численное имя на PHP?

Не так давно погуглив этот вопрос, я отчаялся т.к. не нашёл того чего хотел. Мне было необходимо создание имён вида i20M, тоесть имена содержащие в себе и числа и буквы разного регистра, что позволяло добиться большего количества значений чем при другом варианте. Но большинство сайтов мне с радостью вручали только численное образование имени, т.е такое: 2342523423.

Так же я хотел быть на 100% уверен что новое созданное число не было использовано ранее, такого результата можно было добиться либо записывая все до этого полученные результаты куда-либо( например в БД MySQL), затем проверять нет ли нового созданного числа в базе и если есть генерировать новое, но это всё слишком много лишних действий большая нагрузка на базу, особенно в том случае если у нас большое количество уже созданных имён и скрипт будет постоянно генерировать новые проверять, что совсем нехорошо.

Однако немного посидев и подумав, я решил сделать последовательное создание имён, т.е вроде 1... 2... 3... 4... только ещё и с добавлением букв разного регистра.

В чём плюсы такого подхода?

1. Абсолютно никакой нагрузки от кода.

2. Надёжность. Имя уже не повториться 100%.

3. Лёгкость и простота понимания.

4. Краткость имён. Всего 4 символа и почти 15 миллионов вариаций.

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

Буквенно-численный последовательный создаватель имён на PHP

Сразу предложу ссылки для скачивания рабочего кода, для тех кому лень что-то читать, в чём-то разбираться, копировать со страницы код.

Скачать файлы скрипта

Создаваемое число будет 4-разрядным, однако может иметь 14,7 миллионов разных значений (64 в степени 4).

 Итак, вся конструкция будет состоять из 2 файлов: mynum.txt, в котором будет храниться значение последнего созданного имени, и index.php в котором будет код, следующего содержания:

<?
$findit=array('Y','X','V','U','T','S','R','P','O','N','M','L','K','J','I','H','G',
'F','E','D','C','B','A','z','y','x','v','u','t','s','r','p','o','n','m','l',
'k','j','i','h','g','f','e','d','c','b','a','9','8','7','6','5','4','3','2','1','0');
$replna=array('Z','Y','X','V','U','T','S','R','P','O','N','M','L','K','J','I','H',
'G','F','E','D','C','B','A','z','y','x','v','u','t','s','r','p','o','n','m','l',
'k','j','i','h','g','f','e','d','c','b','a','9','8','7','6','5','4','3','2','1');
$checkfiles=file("./mynum.txt");
foreach($checkfiles as $line)
{$lala=$line;}
$lala=trim($lala);
$numl=strlen($lala);
if($numl<1) die('Числа нет... Что то пошло не так.');
$qwe=substr($lala,-1);
if($qwe=="Z")
{
$qwe2=substr($lala,-2, 1);
if($qwe2=="Z"){
$qwe3 = substr($lala,-3, 1);
if($qwe3=="Z"){
$qwe4 = substr($lala,-4, 1);
if($qwe4=="Z") die('Необходимо расширение, 16,7М уникальных имён закончились');
else{ $qwe4 = str_replace($findit, $replna, $qwe4);
$allbef = substr($lala, 0, -4);
$newall = $allbef.$qwe4."000";
}
}
else{
$qwe3 = str_replace($findit, $replna, $qwe3);
$allbef = substr($lala, 0, -3);
$newall = $allbef.$qwe3."00";
}
}
else{
$qwe2 = str_replace($findit, $replna, $qwe2);
$allbef = substr($lala, 0, -2);
$newall=$allbef.$qwe2."0";

}
}
else{
$qwe = str_replace($findit, $replna, $qwe);
$allbef = substr($lala, 0, -1);
$newall=$allbef.$qwe;
}
$newid = fopen("./mynum.txt","w");
fputs($newid,"$newall");
fclose($newid);
echo $newall;
//Забирайте здесь переменную $newall, которая содержит уникальное имя.
?>

 Как видите всё не так уж сложно как казалось на первый взгляд. В конце этого кода вы можете использовать переменную $newall, содержащую последовательное имя.

Кстати о последовательности, я использовал сначала цифры 0-9, затем буквы разных регистров a-z и A-Z, что в сумме даёт 62 разных значения одного разряда имени, т.е 0-9=10, a-z=26, A-Z=26 и в сумме 62, а это означает что всего различных вариантов 4-разрядного имени будет 62^4=14,77 миллиона.

Данный код сейчас настроен только на 4 разрадные имена, например 143c, Fsfk, и главное для работы всей этой схемы создайте файл mynum.txt, в котором пропишите 4 любых символа используя латинские буквы и/или цифры, с которых и начнётся последовательный счёт. После каждого выполнения кода содержимое файла будет увеличеваться на 1 ( 143c станет 143d).

Если по каким-либо причинам вам не подходит такая схема последовательного создания имён, вы можете воспользоваться случайным:

Буквенно-численный случайный создаватель имён на PHP

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

function generate_name($length){
$code = '';
$symbols = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-~!+*%$#&';
for( $i = 0; $i < (int)$length; $i++ )
{
$num = rand(1, strlen($symbols));
$code .= substr( $symbols, $num-1, 1 );
}
return $code;
}
echo generate_name(5);//Случайное имя из 5 символов

Как видите в переменную $symbols вложены все символы из которых будет построено ваше имя. Вы можете сами добавить или удалить символы по своему желанию.

Использование функции:

generate_name(N), где N- количество символов будущей генерации имени.

Ещё один буквенно-численный генератор имён

Есть также ещё способы генерации имён, например:

$rand = substr(md5(uniqid(rand(), true)), 0, rand(7, 13));

Коротко и понятно.

Ещё вариант:

$rand = md5(time());

Ещё короче и понятней.

В чём плюсы этого кода? Считается что она создаёт абсолютно новые неповторяющиеся имена, но по умолчанию она их делает длиною в 32 символа. Однако это можно легко исправить функцией substr().

На этом статья подходит к концу. Если есть вопросы - велком в комментарии.


You have no rights to post comments

Карта сайта