CMD/BAT - Вопрос по скрипту для генерации паролей.

Аватара пользователя
Jeffers

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Jeffers »

Цитата Foreigner:



Естественно, что они могут повторяться.

..это важно вообще?
CMD/BAT - Вопрос по скрипту для генерации паролей.




Конечно важно, так как:

1. Я уже
CMD/BAT - Вопрос по скрипту для генерации паролей.
о фундаментальном смысле уникальности паролей.

2. Такую задачу четко поставил автор:
Цитата SoulGood:



необходимо сгенерировать пароли без повторов
CMD/BAT - Вопрос по скрипту для генерации паролей.





Цитата Foreigner:



Возьми из массива только уникальные елементы.
CMD/BAT - Вопрос по скрипту для генерации паролей.




Это не решит задачу:
Цитата SoulGood:



необходимо сгенерировать все возможные
пароли
CMD/BAT - Вопрос по скрипту для генерации паролей.











Цитата Foreigner:



Pади интереса:



Код:

Код: Выделить всё

0..12960 | % { (get-random $([char[]]'0123456789abcdefghijklmnopqrstuvwxyz') -count 6) -join '' } | group | ? count -gt 1

Не выдал повторов с шести попыток.
CMD/BAT - Вопрос по скрипту для генерации паролей.




Если монетка 9 раз упала орлом вверх орлом, это не значит, что на десятый бросок не будет решки.



Pади интереса:

Код:

Код: Выделить всё

$rep=0;$k=0
while($rep -lt 1){$k++
    $pass=1..12960|foreach { (get-random $([char[]]'0123456789abcdefghijklmnopqrstuvwxyz') -count 6) -join '' }
    $rep=($pass.Count-($pass|sort -U).count)
}
"Первый повтор встречается на $k попытке"



Код:

Код: Выделить всё

Первый повтор встречается на 11 попытке
Аватара пользователя
Foreigner

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Foreigner »

Цитата Iska:



... а вот тут вопрос — как именно трактовать авторское: Цитата SoulGood:без повторов »



и все возможные комбинации. Имхо, ушли от темы: обсуждаем число комбинаций и рандомную генерацию. Я до сих пор понимал полный набор символов от 000000 до zzzzzz, однако тут звучит идея, что в строке не должно быть повторяющихся символов. Есть ли эффективный алгоритм получения такого набора?


Вот решение "в лоб" для 6 символов в строке

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
	Set "Simb=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
rem	Set "Simb=0 1 2 3 4 5 6 7 8 9"
	Set "FileOut=Z:\Box_Out\FileOut.txt
	>"%FileOut%" (
		Call Echo %%time%%	
		For %%i In (%Simb%) Do (
			For %%j In (%Simb%) Do (
				If Not %%j==%%i For %%k In (%Simb%) Do (
					If Not %%k==%%i If Not %%k==%%j For %%l In (%Simb%) Do (
						If Not %%l==%%i If Not %%l==%%j If Not %%l==%%k For %%m In (%Simb%) Do (
							If Not %%m==%%i If Not %%m==%%j If Not %%m==%%k If Not %%m==%%l For %%n In (%Simb%) Do (
								If Not %%n==%%i If Not %%n==%%j If Not %%n==%%k If Not %%n==%%l If Not %%n==%%m Echo %%i%%j%%k%%l%%m%%n
							)
						)	
					)
				)
			)
		)
		Call Echo %%time%%	
	)
Exit /B








Для отладки брал набор из 10 символов. Результат:

[spoiler]Код:
[/spoiler]

Код: Выделить всё

20:05:18,03	
012345
012346
012347
012348
012349
012354
.....
987645
987650
987651
987652
987653
987654
20:05:34,92

151200 строк



Для 36 символов не берусь оценить время

Вообще-то задача достаточно бессмысленая, разве что как лаба. Практически надо генерировать пароль рандомным образом для каждого конкретного случая, и вероятность того, что пароли совпадут, достаточно низкая
Аватара пользователя
Foreigner

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Foreigner »

Цитата megaloman:



генерировать пароль рандомным образом для каждого конкретного случая, и вероятность того, что пароли совпадут, достаточно низкая
CMD/BAT - Вопрос по скрипту для генерации паролей.




правильно



Код:

Код: Выделить всё

@echo off
set "nA=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
set "l=6"&:[длина пароля]
set "n=10"&:[количество вариантов]
set "f=keys.log"
setlocal enabledelayedexpansion
 for /l %%n in (1 1 %n%) do (
  for /l %%n in (1 1 %l%) do call :#
  >>"%f%" echo:
 )
endlocal
pause& exit
:# 
 set /a r=%random%%%36
 set "s=!nA:~%r%,1!"
 >>"%f%" 
Аватара пользователя
megaloman

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение megaloman »

Цитата megaloman:



Есть ли эффективный алгоритм получения такого набора?
CMD/BAT - Вопрос по скрипту для генерации паролей.






Код:

Код: Выделить всё

param(
    $pathOut = 'C:\temp\test.txt',
    $symbols = '0123456789'
)cls
$file=New-Object IO.StreamWriter ([IO.File]::Open($pathOut,'Create'))
[string[]]$sym=$symbols.ToCharArray()
(Measure-Command{
foreach($a in $sym){
foreach($b in (diff $sym ($a)).InputObject){
foreach($c in (diff $sym ($a,$b)).InputObject){
foreach($d in (diff $sym ($a,$b,$c)).InputObject){
foreach($e in (diff $sym ($a,$b,$c,$d)).InputObject){
foreach($f in (diff $sym ($a,$b,$c,$d,$e)).InputObject){
    $file.Writeline("$a$b$c$d$e$f");$i++
}}}}}}$file.Close()
}).TotalSeconds
"Комбинаций: $i"

По скорости получается 8,03 сек.
Аватара пользователя
alpap

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение alpap »

Цитата Fors1k_m:



По скорости получается 8,03 сек
CMD/BAT - Вопрос по скрипту для генерации паролей.




если только цифры, то можно так
https://rosettacode.org/wiki/Combinations#PowerShell


для [Powershell.CSharp]::Combinations(6,10)

TotalMilliseconds : 72,4355
Аватара пользователя
Fors1k

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Fors1k »

Цитата Fors1k_m:



По скорости получается 8,03 сек.
CMD/BAT - Вопрос по скрипту для генерации паролей.




Все познаётся в корректном сравнении на одной и той же машине.

На моём суперкомпе Ваш код делается 13',
CMD/BAT - Вопрос по скрипту для генерации паролей.
слегка его соптимизировал - 9'


Демонстрирую:

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
	Set "S=0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
	Set "S=0 1 2 3 4 5 6 7 8 9"
	Set "FileOut=Z:\Box_Out\FileOutNew.txt"
	SetLocal EnableExtensions EnableDelayedExpansion
	>"%FileOut%" (
		Call Echo %%time%%	
		For %%i In (%S%) Do (
			Set "S1=!S:%%i=!" &For %%j In (!S1!) Do (
				Set "S2=!S1:%%j=!" &For %%k In (!S2!) Do (
					Set "S3=!S2:%%k=!" &For %%l In (!S3!) Do (
						Set "S4=!S3:%%l=!" &For %%m In (!S4!) Do (
							Set "S5=!S4:%%m=!" &For %%n In (!S5!) Do Echo %%i%%j%%k%%l%%m%%n
						)	
					)
				)
			)
		)
		Call Echo %%time%%
	)
Exit /B





Ссылку от YuS_2 не рассматривал - по условию в общем случае символы могут быть не обязательно цифры
Аватара пользователя
YuS_2

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение YuS_2 »

Прямой перебор по индексу:



Код:

Код: Выделить всё

$y = 6          # длина комбинации
$x = 0..9      # количество элементов
[array] $code = "for (`$c0 = 0; `$c0 -le $($y - 1); `$c0++) {"
for ($i = 1; $i -le ($y - 1); $i++)
{
    $code += "for (`$c$i = 0; `$c$i -le $($x.count-1); `$c$i++) {"
}
$res =
for ($i = 0; $i -le ($y - 1); $i++)
{
    "`$(`$c$i)"
}
$code += '"' + ($res -join '') + '"'
$code += "}" * $y
$code = $code -join "`n"
iex $($code) | sc test.txt
# 600000 записей

Обычная запись, через set-content выдаёт:



Код:

Код: Выделить всё

 0 139 > measure-command { .\2 }
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 10
Milliseconds      : 853
Ticks             : 108537147
TotalDays         : 0,000125621697916667
TotalHours        : 0,00301492075
TotalMinutes      : 0,180895245
TotalSeconds      : 10,8537147
TotalMilliseconds : 10853,7147

Наверное со стримрайтером будет быстрее.
Аватара пользователя
megaloman

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение megaloman »

Цитата Foreigner:



# 600000 записей
CMD/BAT - Вопрос по скрипту для генерации паролей.




Количество комбинаций не может быть 600 000 для "по 6 из 10". (
CMD/BAT - Вопрос по скрипту для генерации паролей.
)

Ошибка в первом for:


Цитата Foreigner:



[array] $code = "for (`$c0 = 0; `$c0 -le $($y - 1); `$c0++) {"
CMD/BAT - Вопрос по скрипту для генерации паролей.




$($y - 1) нужно заменить на $($x.count-1).



Кстати, что бы не писать все время -1, можно исользовать -lt:



Код:

Код: Выделить всё

for ($c0 = 0; $c0 -lt $x.count; $c0++)

Теперь получится верное количество. На моем олд пк результат 43 сек.
Аватара пользователя
Foreigner

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Foreigner »

Прямой перебор по индексу:



Код:

Код: Выделить всё

$y = 6          # длина комбинации
$x = 0..9      # количество элементов
[array] $code = "for (`$c0 = 0; `$c0 -le $($y - 1); `$c0++) {"
for ($i = 1; $i -le ($y - 1); $i++)
{
    $code += "for (`$c$i = 0; `$c$i -le $($x.count-1); `$c$i++) {"
}
$res =
for ($i = 0; $i -le ($y - 1); $i++)
{
    "`$(`$c$i)"
}
$code += '"' + ($res -join '') + '"'
$code += "}" * $y
$code = $code -join "`n"
iex $($code) | sc test.txt
# 600000 записей

Обычная запись, через set-content выдаёт:



Код:

Код: Выделить всё

 0 139 > measure-command { .\2 }
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 10
Milliseconds      : 853
Ticks             : 108537147
TotalDays         : 0,000125621697916667
TotalHours        : 0,00301492075
TotalMinutes      : 0,180895245
TotalSeconds      : 10,8537147
TotalMilliseconds : 10853,7147

Наверное со стримрайтером будет быстрее.
Аватара пользователя
Fors1k

Re: CMD/BAT - Вопрос по скрипту для генерации паролей.

Сообщение Fors1k »

Цитата Foreigner:



Вы код поправьте.

Выдает ворох ошибок:
CMD/BAT - Вопрос по скрипту для генерации паролей.




Скопировал код прямо из поста.
Запуск кода




У megaloman тоже работает:


Цитата megaloman:



Ваш код делается 13' ...
CMD/BAT - Вопрос по скрипту для генерации паролей.




Возможно, у вас что-то потерялось при копировании кода, попробуйте еще раз.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»