Показать полную графическую версию : Вопрос по скрипту для генерации паролей.
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
Прямой перебор по индексу: »
надо не числа, а символы
для чисел, есть более быстродействующее решение (http://forum.oszone.net/post-2921124.html#post2921124)...
обновил PowerShell до 5.1 »
а ещё лучше, установить параллельно powershell core v 7.0
У него много оптимизаций было... и циклы там работают быстрее, примерно в 2 раза
Foreigner
15-05-2020, 13:36
надо не числа, а символы »
А какая разница? Индекс он что для чисел, что для символов... число
А то, что есть способы быстрее, то кто бы спорил.
А какая разница? Индекс он что для чисел, что для символов... »
Если производится замер быстродействия, то он будет некорректен, ибо работа с символами приводит к замедлению... да и топик сам не про числа-индексы ведь.
Тем не менее, Ваш способ достаточно интересный, возьму "на вооружение" :)
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. Не претендую на самый быстрый и логически правильный вариант
Запустите с буквенно-цифровым вариантом, разницы нет »
Совсем другое дело...
Вот ещё вариант ... правда он чуть медленнее, хоть и с одним циклом всего.
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
Ну и напоследок, победитель нашего конкурса генераторов прямого перебора :) :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
YuS_2, подозреваю, что на чистом C, без .Net, будет ещё шустрее.
на чистом C, без .Net, будет ещё шустрее. »
сложно сказать... тут ведь скрипты из шелл-ов сравниваем...
Ну и совсем напоследок, абсолютный победитель нашего конкурса генераторов прямого перебора :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
абсолютный победитель »
это да.
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 »Подозреваю, разница будет еще больше.
Подозреваю, разница будет еще больше. »
можно сравнить, выше добавил тест для 20^6 и PS 7.0, на том же железе...
---------------
вот, собственно, практический результат для задачи из шапки:
36^6, PS v7.0, скрипт (http://forum.oszone.net/post-2921515.html#post2921515)
TotalSeconds : 888,1523298
файл - 16,2Гб
зависит от конфигурации железа »
Мое железо 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
10^6 = 2,1835635 »
не сходится, должно быть гораздо быстрее... у меня 0,5 сек. Ваш скрипт...
не сходится »
Похоже, результат замера для какого-то другого количества символов скопировал)
Запустил еще раз:
10^6 = 0,2484363
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.