Что нового

Генерация случайного имени/ключа с возможностью выбора.

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Прилетело в голову написать функцию для генерации случайного имени или ключа, не знаю почему, но я её написал, понимаю что на форуме полно примеров всяких генераций, но всё равно пишу... думаю может кому пригодится.

В функции имеется возможность выбора, какие данные должны вернутся из функции:

1. Только заглавные буквы.
2. Только строчные буквы.
3. Только цифры.
4. Только заглавные буквы и цифры.
5. Только строчные буквы и цифры.
6. Только заглавные и строчные буквы.
7. Всё вместе (Default).

Код:
MsgBox(0, '', Generate(256))                ;~ Заглавные + строчные + цифры (Default)
MsgBox(0, '', Generate(256, 'Upper;Lower')) ;~ Заглавные + строчные
MsgBox(0, '', Generate(256, 'Upper;Digit')) ;~ Заглавные + цифры
MsgBox(0, '', Generate(256, 'Lower;Digit')) ;~ Строчные  + цифры
MsgBox(0, '', Generate(256, 'Upper'))       ;~ Заглавные
MsgBox(0, '', Generate(256, 'Lower'))       ;~ Строчные
MsgBox(0, '', Generate(256, 'Digit'))       ;~ Цифры

; #Функция# ===========================================================================================
; Имя ...........: Generate
; Описание ......: Генерация случайных символов.
; Синтаксис .....: Generate($iLenght, $sParam)
; Параметры .....: $iLenght - Определяет колличество возвращаемых данных.
;                  $sParam  - Определяет какие символы должны входить в возвращаемые данные.
;                  |Upper - Заглавние буквы.
;                  |Lower - Строчные буквы.
;                  |Digit - Цифры.
;======================================================================================================

Func Generate($iLenght, $sParam = 'Upper;Lower;Digit')
	
	Local $aRet, $aBase, $aInit, $sUpper, $sLower, $sDigit, $sBase
	
	$Upper = 'A;B;C;D;E;F;G;H;I;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;'
	$Lower = 'a;b;c;d;e;f;g;h;i;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;'
	$Digit = '1;2;3;4;5;6;7;8;9;0;'
    
	$aInit = StringSplit($sParam, ';')
	For $i = 1 To $aInit[0]
		$aBase &= Eval($aInit[$i])
	Next	

    $sBase = StringSplit($aBase, ';')
	For $i = 1 To $iLenght
		$aRet &= $sBase[Random(1, $sBase[0], 1)]
	Next
	
	Return $aRet
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
по моему, Round лишний. Random и так возвращает целое значение с флагом 1
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Kaster, да, Вы правы, это я погорячился :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Eval() тоже лишний.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Ну конечно можно и без Eval() но я с помощью него и определяю нужную переменную.


Добавлено:
Сообщение автоматически объединено:

Можно конечно и во так сделать:

Код:
MsgBox(0, '', Generate(256))                ;~ Заглавные + строчные + цифры (Default)
MsgBox(0, '', Generate(256, '/U /L')) ;~ Заглавные + строчные
MsgBox(0, '', Generate(256, '/U /D')) ;~ Заглавные + цифры
MsgBox(0, '', Generate(256, '/L /D')) ;~ Строчные  + цифры
MsgBox(0, '', Generate(256, '/U'))       ;~ Заглавные
MsgBox(0, '', Generate(256, '/L'))       ;~ Строчные
MsgBox(0, '', Generate(256, '/D'))       ;~ Цифры
MsgBox(0, '', Generate(256, '/E')) ;~ Error

; #Функция# ====================================================================================================================
; Имя ...........: Generate
; Описание ......: Генерация случайный символов.
; Синтаксис .....; Generate($iLenght, $sParam)
; Параметры .....: $iLenght - Определяет колличество возвращаемых данных.
;                  $sParam  - Определяет какие символы должны входить в возвращаемые данные.
;                  |Upper - Заглавние буквы.
;                  |Lower - Строчные буквы.
;                  |Digit - Цифры.
; ===============================================================================================================================

Func Generate($iLenght, $sParam = '/U /L /D')
	
	Local $aRet, $aBase, $aInit, $sBase
	
	$aInit = StringSplit($sParam, ' ')	
	For $i = 1 To $aInit[0]
		If (($aInit[$i] = '/U') Or ($aInit[$i] = '/L') Or ($aInit[$i] = '/D')) Then 
		    If ($aInit[$i] = '/U') Then $aBase &= 'A;B;C;D;E;F;G;H;I;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;'
		    If ($aInit[$i] = '/L') Then $aBase &= 'a;b;c;d;e;f;g;h;i;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;'
		    If ($aInit[$i] = '/D') Then $aBase &= '1;2;3;4;5;6;7;8;9;0;'	
		Else
			Return SetError(@error, @extended, 0)
		EndIf	
	Next	

    $sBase = StringSplit($aBase, ';')
	For $i = 1 To $iLenght
		$aRet &= $sBase[Random(1, $sBase[0], 1)]
	Next
	
	Return $aRet
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
MsgBox(0, '', Generate(256))		;~ Заглавные + строчные + цифры (Default)
MsgBox(0, '', Generate(256, 1 + 2))	;~ Заглавные + строчные
MsgBox(0, '', Generate(256, 1 + 4))	;~ Заглавные + цифры
MsgBox(0, '', Generate(256, 2 + 4))	;~ Строчные  + цифры
MsgBox(0, '', Generate(256, 1))		;~ Заглавные
MsgBox(0, '', Generate(256, 2))		;~ Строчные
MsgBox(0, '', Generate(256, 4))		;~ Цифры

Func Generate($iLenght, $iFlags = 0)
	Local $Result = ''
	If Not $iFlags Then $iFlags = 7
	While StringLen($Result) < $iLenght
		$Num = Random(48, 122, 1)
		Switch $Num
			Case 48 To 57
				If BitAND($iFlags, 4) Then $Result &= Chr($Num)
			Case 65 To 90
				If BitAND($iFlags, 1) Then $Result &= Chr($Num)
			Case 97 To 122
				If BitAND($iFlags, 2) Then $Result &= Chr($Num)
		EndSwitch
	WEnd
	Return $Result
EndFunc   ;==>Generate
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Немного нестандартный подход, я бы сделал так:

Код:
MsgBox(64, 'строчные + заглавные + цифры (Default / -1)', _StringGenerate(256, -1))
MsgBox(64, 'строчные + заглавные', _StringGenerate(256, BitOR(2, 4)))
MsgBox(64, 'заглавные + цифры', _StringGenerate(256, BitOR(4, 8)))
MsgBox(64, 'строчные  + цифры', _StringGenerate(256, BitOR(2, 8)))
MsgBox(64, 'строчные', _StringGenerate(256, 2))
MsgBox(64, 'заглавные', _StringGenerate(256, 4))
MsgBox(64, 'цифры', _StringGenerate(256, 8))

; #Функция# ===========================================================================================
; Имя ...........: _StringGenerate
; Описание ......: Генерация случайных символов.
; Синтаксис .....; _StringGenerate($iLenght, $iFlag)
; Параметры .....: $iLenght - Определяет колличество возвращаемых данных.
;                  $iFlag   - Определяет какие символы должны входить в возвращаемые данные.
;                             Следующие значения можно совмещать через BitOR:
;                             2 - Строчные буквы.
;                             4 - Заглавние буквы.
;                             8 - Цифры.
;======================================================================================================
Func _StringGenerate($iLenght, $iFlag = -1)
	Local $iASCII, $iDigit, $sData, $aData, $sRet
	
	If $iFlag = -1 Or (IsKeyword($iFlag) And $iFlag = Default) Then
		$iFlag = BitOR(2, 4, 8)
	EndIf
	
	;Lower letters
	If BitAND($iFlag, 2) = 2 Then
		For $iASCII = 97 To 122
			$sData &= Chr($iASCII)
		Next
	EndIf
	
	;Upper letters
	If BitAND($iFlag, 4) = 4 Then
		For $iASCII = 65 To 90
			$sData &= Chr($iASCII)
		Next
	EndIf
	
	;Digits
	If BitAND($iFlag, 8) = 8 Then
		For $iDigit = 0 To 9
			$sData &= $iDigit
		Next
	EndIf
	
	$aData = StringSplit($sData, '')
	
    For $i = 1 To $iLenght
        $sRet &= $aData[Random(1, $aData[0], 1)]
    Next
    
    Return $sRet
EndFunc
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Не додумался сделать через Chr() ;D , спасибо за примеры, буду иметь ввиду :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Не додумался сделать через Chr()
Я додумался, но у Yashied это получилось лучше, в плане экономии и эргономичности кода.
Хотя в его примере можно было бы не использовать StringLen (постоянные вызовы = замедление), а просто пройтись по For..Next.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Ну я думаю это только для примера, а если действительно делать, то заботишься о производительности кода, мне оба примера очень понравились, радует что в самой функции нет как у меня типа 'a;b;c;', это уже я не догадался :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А вообще, деление между Upper и Lower нет смысла делать, т.к. в конце всегда можно вызвать StringUpper() или StringLower() соответственно.

:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
деление между Upper и Lower нет смысла делать, т.к. в конце всегда можно вызвать StringUpper() или StringLower() соответственно
И тогда все символы будут одного регистра :smile:
Кстати в функцию можно было бы добавить поддержку символов юникода, или даже произвольный набор символов.


Добавлено:
Сообщение автоматически объединено:

[?]
можно было бы не использовать StringLen (постоянные вызовы = замедление), а просто пройтись по For..Next
Ошибаюсь, StringLen в этом применений нужен для полной строки.

Вот что получилось по поводу произвольного набора:

Код:
MsgBox(64, 'Произвольный набор символов - 16', _StringRandomGenerate(256, 16))
MsgBox(64, 'Строчные + Заглавные + Цифры - Default / -1', _StringRandomGenerate(256, -1))
MsgBox(64, 'Строчные + Заглавные - BitOR(2, 4)', _StringRandomGenerate(256, BitOR(2, 4)))
MsgBox(64, 'Заглавные + Цифры - BitOR(4, 8)', _StringRandomGenerate(256, BitOR(4, 8)))
MsgBox(64, 'Строчные  + Цифры - BitOR(2, 8)', _StringRandomGenerate(256, BitOR(2, 8)))
MsgBox(64, 'Строчные - 2', _StringRandomGenerate(256, 2))
MsgBox(64, 'Заглавные - 4', _StringRandomGenerate(256, 4))
MsgBox(64, 'Цифры - 8', _StringRandomGenerate(256, 8))


; #FUNCTION# ====================================================================================================
; Name...........:	_StringRandomGenerate
; Description....:	Generates random string using letters and/or digits and/or any set characters from the ASCI table.
; Syntax.........:	_StringRandomGenerate($iLenght, $iFlag = -1)
; Parameters.....:	$iLenght   - Lenght of the return string.
;					$iFlag     - [Optional] Define characters to return (default -1, all flags). Following are supported (can be combined with BitOR):
;                                2 - Low case letters.
;                                4 - Upper case letters.
;                                8 - Digits.
;                                16 - Any characters from the set between $iStartChr and the $iEndChr (see next parameters).
;					$iStartChr - [Optional] Start character from ASCI table (used only with $iFlag = 16), default is 48 (0).
;					$iEndChr   - [Optional] End character from ASCI table (used only with $iFlag = 16), default is 122 (z).
;					
; Return values..:	Random string.
;					
; Author.........:	Yashied, CreatoR
; Modified.......:	
; Remarks........:	
; Related........:	
; Link...........:	
; Example........:	
; ===============================================================================================================
Func _StringRandomGenerate($iLenght, $iFlag = -1, $iStartChr = 48, $iEndChr = 122)
	Local $iRnd, $sRet, $iStrLen
	
	If $iFlag = -1 Or $iFlag = 0 Or (IsKeyword($iFlag) And $iFlag = Default) Then
		$iFlag = BitOR(2, 4, 8)
	EndIf
    
	If $iFlag = 16 Then
		$iFlag = BitOR(2, 4, 8, 16)
	EndIf
	
	While StringLen($sRet) < $iLenght
		$iRnd = Random($iStartChr, $iEndChr, 1)
		
        Switch $iRnd
			Case 48 To 57 ;Digits
                If BitAND($iFlag, 8) Then
					$sRet &= Chr($iRnd)
				EndIf
            Case 65 To 90 ;Upper
                If BitAND($iFlag, 4) Then
					$sRet &= Chr($iRnd)
				EndIf
            Case 97 To 122 ;Lower
                If BitAND($iFlag, 2) Then
					$sRet &= Chr($iRnd)
				EndIf
			Case $iStartChr To $iEndChr ;Set characters
				If BitAND($iFlag, 16) Then
					$sRet &= Chr($iRnd)
				EndIf
        EndSwitch
	WEnd
	
    Return $sRet
EndFunc
 
Верх