Генерация пароля (pasword generation)

  • Автор темы Автор темы lmike
  • Дата начала Дата начала

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 952
602
BIT
431
первым делом спросил гугл ;)
то что увидел в первых подборка меня "огорчило"
наткнулся на link removed кот подошел под критерии "моих тараканов"
Код:
%REM
*--------------------------------------------
   Function GenPassword
   Description: Comments for Function
%END REM
Public Function GenPassword(PWLength As Integer, range As Single) As String
   On Error GoTo ErrH
   Dim i As Integer
   Dim RndNumber As Integer
   Dim RndAllowed As Boolean
   For i = 1 To PWLength
     RndAllowed = False
     Do
       Select Case range
       'Random from ASCII 48 - 122 (letters and digits)
       Case 0
         RndNumber = Round((74 * Rnd() +48),0)
       'Random from ASCII 65 - 122 (only letters)
       Case 1
         RndNumber = Round((57 * Rnd() +65),0)
       'Random from ASCII 48 - 57 (only digits)
       Case 2
         RndNumber = Round((9 * Rnd() +48),0)
       Case Else
         Error 1024, CS_BADRANGE
       End Select  
       Select Case RndNumber
         'digits
       Case 48 To 57
         RndAllowed = True
         'CAPS
       Case 65 To 90
         RndAllowed = True
         'non CAPS
       Case 97 To 122
         RndAllowed = True
       Case Else
         RndAllowed = False
     End Select
     Loop Until RndAllowed
     GenPassword=GenPassword & Chr(RndNumber)
   Next
Quit:
   Exit Function
ErrH:
   Error Err, RaiseError
   Resume Quit
End Function
 
Последнее редактирование модератором:
  • Нравится
Реакции: alexas1
критически оценил case ;) - многабукав
Код:
%REM
*--------------------------------------------
    Function GenPassword
    Description: Comments for Function
%END REM
Public Function GenPassword(PWLength As Integer, range As Single) As String
    On Error GoTo ErrH
    Dim i As Integer
    Dim RndNumber As Integer
    Dim RndAllowed As Boolean
    For i = 1 To PWLength
        Do
            Select Case range
            'Random from ASCII 48 - 122 (letters and digits)
            Case 0
                RndNumber = Round((74 * Rnd() +48),0)
            'Random from ASCII 65 - 122 (only letters)
            Case 1
                RndNumber = Round((57 * Rnd() +65),0)
            'Random from ASCII 48 - 57 (only digits)
            Case 2
                RndNumber = Round((9 * Rnd() +48),0)
            Case Else
                Error 1024, CS_BADRANGE
            End Select
%REM       
            Select Case RndNumber
                'digits
            Case 48 To 57
                RndAllowed = True
                'CAPS
            Case 65 To 90
                RndAllowed = True
                'non CAPS
            Case 97 To 122
                RndAllowed = True
            Case Else
                RndAllowed = False
        End Select
%END REM
            RndAllowed = True
            If RndNumber>90 And RndNumber < 97 Then RndAllowed=False
        Loop Until RndAllowed
        GenPassword=GenPassword & Chr(RndNumber)
    Next
Quit:
    Exit Function
ErrH:
    Error Err, RaiseError
    Resume Quit
End Function
 
Код:
Function GenPassword( PassLen As Integer, PassType As Integer ) As String
'   PassType - тип пароля:
'   0 - цифры и символы обоих регистров
'  1 - только цифры
'  2 - цифры и символы  нижнего регистра

   Dim i As Integer, SymbolType As Integer
   Dim Symbol As String

  
   Randomize  
  
   For i = 1 To PassLen
     Select Case PassType
     Case 0: SymbolType = Fix( 3 * Rnd() )
      
     Case 1: SymbolType = 0
      
     Case 2: SymbolType = Fix( 2 * Rnd() )      
      
     End Select
    
    
     Select Case Symboltype
     Case 0:
       GenPassword = GenPassword + CStr( Fix( 10 * Rnd() ) )
                
     Case 1:  '  Нижний регистр
       GenPassword = GenPassword + CStr( Chr( 97 + Int( 26 * Rnd() ) ) )
      
     Case 2:  '  Верхний регистр
       GenPassword = GenPassword + CStr( Chr( 65 + Int( 26 * Rnd() ) ) )      
      
     End Select
    
   Next
  
End Function
 
Последнее редактирование:
  • Нравится
Реакции: Murtas
что-то с кодом... Print {fix:} Fix(3*0.1){;} Fix(2*0.1)
попробуйте ;)
Int() - не способствует равномерному распределению (как и Fix) именно поэтому и существует Round
по логике - если генерить в цикле, то надо бы и способ преобразования (по возможности) одинаковый
Chr - значит единообразно
[DOUBLEPOST=1424271396,1424271208][/DOUBLEPOST]@akat оборачивайте в теги code и spoiler
[DOUBLEPOST=1424271682][/DOUBLEPOST]да Randomize (затравка) имеет смысл, если будет код на сервере
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!