Войти

Показать полную графическую версию : Вопрос по скрипту для генерации паролей.


Страниц : 1 2 [3]

megaloman
15-05-2020, 10:08
У меня тоже был ворох ошибок, обновил PowerShell до 5.1

Foreigner
15-05-2020, 11:57
megaloman:
обновил PowerShell до 5.1

$host.version.tostring()
5.1.18362.752

$host.version.tostring()
7.0.0

YuS_2
15-05-2020, 13:05
Прямой перебор по индексу: »
надо не числа, а символы
для чисел, есть более быстродействующее решение (http://forum.oszone.net/post-2921124.html#post2921124)...

обновил PowerShell до 5.1 »
а ещё лучше, установить параллельно powershell core v 7.0
У него много оптимизаций было... и циклы там работают быстрее, примерно в 2 раза

Foreigner
15-05-2020, 13:36
надо не числа, а символы »
А какая разница? Индекс он что для чисел, что для символов... число
А то, что есть способы быстрее, то кто бы спорил.

YuS_2
15-05-2020, 16:59
А какая разница? Индекс он что для чисел, что для символов... »
Если производится замер быстродействия, то он будет некорректен, ибо работа с символами приводит к замедлению... да и топик сам не про числа-индексы ведь.
Тем не менее, Ваш способ достаточно интересный, возьму "на вооружение" :)

Foreigner
15-05-2020, 20:04
ибо работа с символами приводит к замедлению... »

В данном случае скрипт работает только с индексами массива, а они [int]
Запустите с буквенно-цифровым вариантом, разницы нет, зависит только от количества циклов:


$cmb = 4
$arr = 'a','b','c','d',2,0

$code =
for ($i = 0; $i -le ($cmb - 1); $i++)
{
"for (`$c$i = 0; `$c$i -le $($arr.Length - 1); `$c$i++) {"
}

$res =
for ($i = 0; $i -le ($cmb - 1); $i++)
{
"`$(`$arr[`$c$i])"
}

$code += '"' + ($res -join '') + '"'
$code += "}" * $cmb
$code = $code -join "`n"

# $code # проверка сгенерированного кода

Invoke-Expression $($code) | Set-Content test.txt


PS. Не претендую на самый быстрый и логически правильный вариант

YuS_2
16-05-2020, 04:57
Запустите с буквенно-цифровым вариантом, разницы нет »
Совсем другое дело...

Вот ещё вариант ... правда он чуть медленнее, хоть и с одним циклом всего.
param (
[string]$n = 'abcdefghij',
[int]$m = 6
)

function combinations ([int]$x, [string]$y, [int]$lim) {
$chararr = $y.tochararray()
for ($j=0;$j -lt $lim;$j++){
$k = [string[]]"$j".padleft($x,'0').tochararray()
-join $chararr[$k]
}
}

$z = [math]::pow($n.length,$m)

combinations $m $n $z |set-content out_test.txt

YuS_2
16-05-2020, 17:05
Ну и напоследок, победитель нашего конкурса генераторов прямого перебора :) :yes: :
param(
[string]$str = 'abcdefghij',
[int] $lim = 6,
[string]$path = '.\arrangement_wr_csharp_2.txt'
)

add-type @"
using System;
using System.Collections.Generic;
public class Arrangement
{
static String Convert(string sym, int num, int tLen) {
var sym0 = sym[0];
var len = sym.Length;
var res = "";
int ind;
while (num > 0) {
ind = num%len;
num = num/len;
res = sym[ind] + res;
}
return res.PadLeft(tLen, sym0);
}
public static IEnumerable<String> ArrangWithRep(string sym, int len){
for (var i = 0; i < Math.Pow(sym.Length, len); i++)
yield return Convert(sym, i, len);
}
}
"@
measure-command{
$file = new-object io.streamwriter ([io.file]::open($path,'Create'))
foreach ($item in ([arrangement]::arrangwithrep($str,$lim))){
$file.writeline($item)
}
$file.close()
} | out-file time_arrangement_wr_csharp_2.txt

TotalSeconds : 4,6773432

Iska
16-05-2020, 22:45
YuS_2, подозреваю, что на чистом C, без .Net, будет ещё шустрее.

YuS_2
17-05-2020, 08:06
на чистом C, без .Net, будет ещё шустрее. »
сложно сказать... тут ведь скрипты из шелл-ов сравниваем...

Fors1k
17-05-2020, 16:35
Ну и совсем напоследок, абсолютный победитель нашего конкурса генераторов прямого перебора :clever-ma :dance: :
param(
$pathOut = 'C:\temp\test.txt',
$Symbols = 'abcdefghij',
$Length = 6
)cls

function Get-Combinations($pathOut,$Symbols,$Length){$cmd=@"
using System;using System.IO;
public class Combiner{
public static string Combinations(string[] sym, string writePath){
using (StreamWriter fs=new StreamWriter(writePath, false, System.Text.Encoding.Default)){
foreach (string i in sym){//do`nfs.WriteLine (i/*i*/);}//end
}return "Done!";}}
"@;[string[]]$sym=$Symbols.ToCharArray()
for($i=1;$i -lt $Length;$i++){$cmd=$cmd -Replace '//do', "`nforeach (string i$i in sym){//do"
$cmd=$cmd -Replace '//end', "}//end";$cmd=$cmd.Replace('/*i*/', "+i$i/*i*/")
}Add-Type $cmd;[Combiner]::Combinations($sym,$pathOut)}


(Measure-Command{

Get-Combinations $pathOut $Symbols $Length

}).TotalSeconds
TotalSeconds : 0,2987353
'abcdefghij0123' = 1,978599
'0123456789abcdefghij' = 17,4350418

megaloman
17-05-2020, 18:26
Из любопытства сравнил на своём ноуте:
скрипт PS Fors1k_m (http://forum.oszone.net/post-2921515-51.html)
скрипт PS YuS_2 (http://forum.oszone.net/post-2921423-48.html)
скрипт CMD Megaloman (http://forum.oszone.net/post-2920900-7.html)
макрос VBA Excel
скрипт Vbs

6-0123456789
Fors1k_m PS 1.2s
Megaloman vba Exc 4.3s
YuS_2 PS 4.7s
Megaloman vbs 9.3s
Megaloman CMD 43s

6-0123456789abcdef
Fors1k_m PS 10.6s
Megaloman vba Exc 38s
YuS_2 PS 124s
Megaloman vbs 151s
'Sub rrr2()
Symb = "abcdefghij"
Symb = "0123456789abcdef"
' Symb = "0123456789"
N = 6
FileOut = "Z:\Box_Out\6-0123456789abcdef_vbs_line.txt"

T = Timer

NS = Len(Symb)
ReDim Smb(NS - 1)

For i = 1 To NS
Smb(i - 1) = Mid(Symb, i, 1)
Next

Set F = CreateObject("Scripting.FileSystemObject").CreateTextFile(FileOut, True)
Call SortLine(N, Smb, F, 0, "")
F.Close

MsgBox Timer - T
'End Sub
Sub SortLine(ii, SS, F, NN, sOut)
NN1 = NN + 1

If NN1 = ii Then
For Each i In SS
sOut1 = sOut1 + sOut + i + vbCrLf
Next
F.Write sOut1
Else
For Each i In SS
sOut1 = sOut + i
Call SortLine(ii, SS, F, NN1, sOut1)
Next
End If
End Sub
и, дополнительно, 'Sub rrr()
Symb = "0123456789abcdef"
N = 6
FileOut = "Z:\Box_Out\vbs_uni_6-0123456789abcdef.txt"

T = Timer

NS = Len(Symb)
For i = 1 To NS
Smb = Smb + vbTab + Mid(Symb, i, 1)
Next

Set F = CreateObject("Scripting.FileSystemObject").CreateTextFile(FileOut, True)
Call Sort(N, Smb, F, 0, "")
F.Close

MsgBox Timer - T
'End Sub

Sub Sort(ii, SS, F, NN, sOut)
MS = Split(Mid(SS, 2), vbTab)
NN1 = NN + 1

If NN1 = ii Then
For Each i In MS
sOut1 = sOut1 + sOut + i + vbCrLf
Next
F.Write sOut1
Else
For Each i In MS
sOut1 = sOut + i
SS1 = Replace(SS, vbTab + i, "")
Call Sort(ii, SS1, F, NN1, sOut1)
Next
End If
End Sub

YuS_2
17-05-2020, 19:07
абсолютный победитель »
это да.
TotalSeconds : 0,2987353 »
зависит от конфигурации железа и от версии PS...
при прочих равных, PS 5.1
TotalSeconds : 4,5936197
TotalSeconds : 1,049038
быстрее в 4,6 раз

для '0123456789abcdefghij'
TotalSeconds : 306,0904845
TotalSeconds : 42,464878
быстрее в 7,2 раз

т.е. с увеличением числа символов целевого набора, разница существенно возрастает...
а по сути:
64000000 - 42,5сек
считаем для 36 - 6:
2176782336 - 1445 сек/60= 24 мин.
уже более-менее вменяемый результат, который можно ещё ускорить, если использовать железо получше и PS v7.0

для 10^6 в PS 7.0
TotalSeconds : 3,4414547
TotalSeconds : 0,5906468

для 64000000 в PS 7.0
TotalSeconds : 214,1145746
TotalSeconds : 25,2777355

- как-то так...
файл, кстати, получается 488,2Мб

Из любопытства сравнил на своём ноуте: »
а powershell какой версии? Лучше для сравнения с vbs использовать 7.0

megaloman
17-05-2020, 19:19
YuS_2, а powershell какой версии? »5.1.14409.1005Лучше для сравнения с vbs использовать 7.0 »Подозреваю, разница будет еще больше.

YuS_2
17-05-2020, 19:23
Подозреваю, разница будет еще больше. »
можно сравнить, выше добавил тест для 20^6 и PS 7.0, на том же железе...

---------------
вот, собственно, практический результат для задачи из шапки:
36^6, PS v7.0, скрипт (http://forum.oszone.net/post-2921515.html#post2921515)
TotalSeconds : 888,1523298
файл - 16,2Гб

Fors1k
17-05-2020, 20:40
зависит от конфигурации железа »
Мое железо 2008г выпуска. (https://www.asus.com/ru/Motherboards/P5Q_PRO/overview/)
Интересно увидеть результат у кого-нибудь на современном пк.
если использовать PS v7.0 »
Скачал из интереса PS v7. Результат и правда изменился:

10^6 = 2,1835635
36^6 = 391,1104797

VBS (vba) от megaloman, на моем железе:
10^6 = 3,387438

YuS_2
17-05-2020, 20:53
10^6 = 2,1835635 »
не сходится, должно быть гораздо быстрее... у меня 0,5 сек. Ваш скрипт...

Fors1k
17-05-2020, 21:00
не сходится »
Похоже, результат замера для какого-то другого количества символов скопировал)
Запустил еще раз:
10^6 = 0,2484363




© OSzone.net 2001-2012