При разработке нового проекта мне потребовалось создать функцию, которая по заданным критериям генерирует строку определенной длины со случайным набором символов. Это было необходимо для организации хранения файлов на удаленном сервере с уникальными именами, уникальным ключом, записанным в базе данных для получения доступа к этому файлу. Так же, добавление функциональности получения ключа доступа при регистрации в программе (для избавления пользователя придумывать свой пароль) и отправки кода подтверждения электронного адреса пользователю на указанный им Email. Некая проверка владения адресом. Все эти задачи выполняет одна единственная функция, которой я дал название RandString.
Этой функцией, обернутой в удобный интерфейс, я с вами и поделюсь. Вы же можете использовать полученную в итоге программу для генерации паролей, например к соц. сетям или форумам, тем самым избавив себя от постоянной головоломки придумывания сложных паролей, либо в других целях. Алгоритм функции очень прост и легок в понимании, ее можно легко переписать на другой язык которым Вы владеете, например php или js, тем самым дополнить функциональность своего сайта. В общем, приступим!
Открываем нашу, вечно живую, среду Delphi. Для написания примера я буду использовать Delphi 7, Вы же можете использовать более новую версию, пример работает в любой среде. Создаем новый проект с формой и размещаем на форме следующие компоненты: 4-е CheckBox’а, одну кнопку Button, один Edit, один Label и один SpinEdit (ввод чисел).
Имена компонентам оставлю по умолчанию, но Вы можете их обозвать, только в дальнейшем не запутайтесь. А вот свойства Caption изменим, для понимания пользователем всех переключаетелей:
— CheckBox1 – «Символы в нижнем регистре»;
— CheckBox2 – «Символы в верхнем регистре»;
— CheckBox3 – «Числа»;
— CheckBox4 – «Спец. символы»;
— Button1 – «Генератор»;
— Label1 – «Длина строки».
Edit1 – свойство Text сделаем пустым, а у компонента SpinEdit1 свойство Value поставим равным 20 (кол-во символов в генерируемой строке по умолчанию). Так же, ограничим диапазоны минимального значения MinValue = 2 и MaxValue = 100 т.е. наша строка должна быть не меньше 2 символов и не больше 100.
CheckBox’ы – логические переключатели, будут сигнализировать нашей функции RandString, символы какого типа включать в генерируемую строку.
SpinEdit1 — как Вы наверно догадались, задает длину генерируемой строки.
Ну а Edit1 принимает результат.
Расположите все компоненты на форме приблизительно как на рисунке ниже или по своему усмотрению.
Ну все, подготовительные этапы завершены, переходим к самому интересному, к написанию кода.
В модуле, ниже ключевого слова implementation пишем следующий код функции:
function Randstring(Len:word; LCase, UpCase, Digit, SpecSymb:boolean):string;
const symLCase=‘abcdefghijklmnopqrstuvwxyz’; //набор символов в нижнем регистре
symUCase=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’; //набор символов в верхнем регистре
symNum =‘0123456789’; //набор цифр
symSpecSymb = ‘[]{},.»;:-+#’; //набор спец. символов
var name,symb:string;
i:word;
begin
//создаем общий набор symb в соответствии с отмеченными параметрами функции LCase, UpCase, Digit, SpecSymb
if LCase then symb:=symb+symLCase; //Включаем в набор символы нижнего регистра
if UpCase then symb:=symb+symUCase; //Включаем в набор символы верхнего регистра
if Digit then symb:=symb+symNum; //Включаем в набор цифры
if SpecSymb then symb:=symb+symSpecSymb; //Включаем в набор спец. символы
if symb=» then symb:=symLCase; //проверяем, если набор остался пустым, то по умолчанию включаем символы нижнего регистра
name:=»;
for i := 1 to Len do
//генерируем случайные символы из набора symb
//цикл повторяется указанное в параметре Len раз
//функция random возвращает целое число от 0 до размера набора symb
name:=name+symb[random(length(symb))+1];
Result:=Name; //выводит результат
end;
Практически каждую строку кода я прокомментировал. Вкратце логика такая:
- Заполняем наборы символов, это константы – symLCase, symUCase, symNum, symSpecSymb;
- Далее, в соответствии с входными логическими параметрами, создаем одну большую строку-набор символов, из которой и будем в дальнейшем случайным образом вытягивать символы по индексу. Если, не один из параметров не указан, то по умолчанию берем набор symLCase – строка в нижнем регистре.
- Теперь в цикле for, строим случайную строку. Т.е. используя функцию Random, которая возвращает случайное целое число от 0 до указанного диапазона, в нашем случае диапазон это длина всего набора символов, из которого выбираются символы. Число, которое вернет функция Random, это не что иное, как индекс символа в созданном наборе символов. Вспоминаем, что строка это, одномерный массив и обращаясь к символу в наборе symb [индекс], мы получаем случайный символ, который прибавляем к новой строке name.
- Ну и последнее, это возвращаем результат работы функции.
Чуть не забыл, цикл For будет повторяться столько раз, сколько указано во входном параметре функции Len (длина строки).
В принципе, это и все! Осталось только ее вызвать и результат передать пользователю. Для этого кликнем по кнопке Генератор два раза, чтобы создать событие Click, и добавим следующий код:
Edit1.Text:=RandString(SpinEdit1.Value, CheckBox1.Checked, CheckBox2.Checked, CheckBox3.Checked, CheckBox4.Checked);
Для тех, у кого возникли проблемы, привожу полный код модуля:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
SpinEdit1: TSpinEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Randstring(Len:word; LCase, UpCase, Digit, SpecSymb:boolean):string;
const symLCase=‘abcdefghijklmnopqrstuvwxyz’; //набор символов в нижнем регистре
symUCase=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’; //набор символов в верхнем регистре
symNum =‘0123456789’; //набор цифр
symSpecSymb = ‘[]{},.»;:-+#’; //набор спец. символов
var name,symb:string;
i:word;
begin
//создаем общий набор symb в соответствии с отмеченными параметрами функции LCase, UpCase, Digit, SpecSymb
if LCase then symb:=symb+symLCase; //Включаем в набор символы нижнего регистра
if UpCase then symb:=symb+symUCase; //Включаем в набор символы верхнего регистра
if Digit then symb:=symb+symNum; //Включаем в набор цифры
if SpecSymb then symb:=symb+symSpecSymb; //Включаем в набор спец. символы
if symb=» then symb:=symLCase; //проверяем, если набор остался пустым, то по умолчанию включаем символы нижнего регистра
name:=»;
for i := 1 to Len do
//генерируем случайные символы из набора symb
//цикл повторяется указанное в параметре Len раз
//функция random возвращает целое число от 0 до размера набора symb
name:=name+symb[random(length(symb))+1];
Result:=Name; //выводит результат
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//задаем параметры функции Randstring и выводит результат в Edit1
Edit1.Text:=Randstring(SpinEdit1.Value,//длина генерируемой строки
CheckBox1.Checked,//если отмечен флажком, то включаем в набор символы нижнего регистра
CheckBox2.Checked,//если отмечен флажком, то включаем в набор символы верхнего регистра
CheckBox3.Checked,//если отмечен флажком, то включаем в набор цифры
CheckBox4.Checked); //если отмечен флажком, то включаем в набор спец. символы
end;
end.
На этом все! Компилируем и пробуем.
Скачать полный пример Вы можете отсюда.