|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Составление комбинаций символов
Интересует алгоритм для составления всех возможных комбинаций из указанных символов. То есть,
a b c .. z aa ab .. zz aaa и так далее |
#2
|
|||
|
|||
Присал такое:
Код:
procedure IncTestID(var AID : String; Num : Integer); type TCharSet = 'A'..'Z'; var C : TCharSet; I : Integer; begin If AID = '' Then Begin AID := 'A'; Exit; End; C := AID[Num]; If C = 'Z' Then Begin C := 'A'; If Num = 1 Then Begin AID := 'A' + AID; For I := 1 To Length(AID) Do AID[i] := 'A'; WriteLn('Iteration: ' + AID); end Else IncTestID(AID,Num-1); End Else Begin C := Succ(C); End; AID[Num] := C; end; procedure TMyApplication.Exec; var V : String; begin V := ''; While V < 'ZZZZ' Do Begin IncTestID(V,Length(V)); WriteLn(V); End; end; только больше, чем на 3х лучше не пробовать. Уже на 4 работает очень долго... |
#3
|
||||
|
||||
генерация пароль-списков )) Хакеры не спят ))
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы... ICQ: 593977748 Nick: Marvel |
#4
|
|||
|
|||
Не, не прокатит. Генерация на 4 символа (не самый длинный пароль) у меня заняла около 2 часов и создала файл примерно в 80 Гб (правда там в файле куча служебной информации на один вариант было, но не суть). Прикинь сколько займет времени и места тупая генерация хотя бы 6 символьного пароля. И это при том, что генерилось только 26 заглавных букв латинского алфавита. Добавь туда маленькие буквы, цифры и спецсимволы и ты поймешь, что это не вариант. Списки паролей генеряться немного по другому принципу...
|
#5
|
||||
|
||||
Цитата:
Использование string ? Отсутствие буферизации ? Операции вывода непосредственно при генерации ? Я не удивляюсь такому времени работы алгоритма... Код:
program PassGen; {$APPTYPE CONSOLE} uses Windows; type TByteArray = array of byte; const CHF = 65; // CHar First - первый символ (соотв. коду символа 'A') CHL = 90; // CHar Last - последний символ (соотв. коду символа 'Z') CHC = CHL-CHF+1; // CHar Count - кол-во символов (90-65+1=26) MPL = 4; // Max Password Length - максимальная длина пароля // для данного алгоритма допустимы значения MPL от 1 до 5 procedure Generate(const N:Cardinal; P:Cardinal); var i:Integer; j:Cardinal; X:TByteArray; begin SetLength(X,N+1); for i:=0 to N-1 do X[i]:=CHF; X[N] := 13; j:=0; repeat CopyMemory(Pointer(P+(N+1)*j),@X[0],N+1); Inc(j); i:=N-1; while (i>=0)and(X[i]=CHL) do begin X[i]:=CHF; Dec(i) end; if i>=0 then inc(X[i]) else Break; until False; X := nil; end; var i,TmpSize,Shift : Cardinal; Buff : Cardinal; BuffSize : Cardinal; // FileOut : THandle; FOPath : String; WriteCnt:Cardinal; begin // Init BuffSize := 0; TmpSize := 1; for i:=1 to MPL do begin TmpSize := TmpSize * CHC; Inc(BuffSize,TmpSize * (i+1)); end; Buff := GlobalAlloc(GMEM_FIXED,BuffSize); // Generate TmpSize := 1; Shift := 0; for i:=1 to MPL do begin Generate(i,Buff + Shift); TmpSize := TmpSize * CHC; Inc(Shift,TmpSize * (i+1)); end; // Output FOPath := ParamStr(0) + '.output.txt'; FileOut := CreateFile(PAnsiChar(FOPath),GENERIC_WRITE,0,nil, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL+FILE_FLAG_WRITE_THROUGH,0); TmpSize := 1; Shift := 0; for i:=1 to MPL do begin TmpSize := TmpSize * CHC ; WriteFile(FileOut,Pointer(Buff + Shift)^,TmpSize * (i+1),WriteCnt,nil); Inc(Shift,TmpSize * (i+1)); end; CloseHandle(FileOut); GlobalFree(Buff); end. Для генерации паролей большей длины его надо немного переписать: выделять буфер меньшей длины чем необходимо, и в процессе генерации заполнять его и сохранять на диск. (Так как для всей комбинаций паролей с длиной 6, а их 26^6 = 308915776 , необходим буфер с размером 26^6 * 7 = 2162410432 - больше 2 Гб) PS: Про скорость алгоритма - для генерации всех паролей с длиной от 1 до 5 потребовалось ~2 сек, размер результирующего файла ~70 Мб. Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 02.07.2010 в 15:23. |