Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.38.24] |
|
Сообщ.
#1
,
|
|
|
имеется строка которую нужно сравнить с массивом строк. Массив наращивается и когда достигает больших размеров (более 2000 строк) то сравнение которое использую я очень медленное.
Do sort = sort + 1 If pass(sort) = pass_new Then GoTo 1 Loop Until sort = i где i это текущее кол-во строк в массиве, а sort сравниваемая строка |
Сообщ.
#2
,
|
|
|
Предложение: массив упорядочить, сравнение проводить методом деления пополам.
|
Сообщ.
#3
,
|
|
|
Ну и вместо Goto лучше Exit Do использовать, что ли...
|
Сообщ.
#4
,
|
|
|
Хммм.. А где постановка задачи? Чего требуется то?
PS: Ненавижу GoTo /Except On Error statement/ |
Сообщ.
#5
,
|
|
|
Цитата Spectr-7 @ имеется строка которую нужно сравнить с массивом строк. Массив наращивается и когда достигает больших размеров (более 2000 строк) то сравнение которое использую я очень медленное. Do sort = sort + 1 If pass(sort) = pass_new Then GoTo 1 Loop Until sort = i где i это текущее кол-во строк в массиве, а sort сравниваемая строка Сравнение даже намного более большего количества строк происходит очень быстро. Что для тебя быстро? Как часто ты проводишь проверку? |
Сообщ.
#6
,
|
|
|
Задача сгененировать до 25000 различных паролей. Максимум 24 символа в каждом. Генерируется пароль посимвольно, потом идет проверка - есть ли такой пароль в уже созданных.
Dim i, a, comp, rnd_s, sort As Integer Dim pass_new As String i = 0 Do i = i + 1 If component(i) <> 0 Then comp = comp + 1 Loop Until i = 255 i = 0 Do Randomize Time DoEvents i = i + 1 1 ' Метка для возвращения a = 0 pass_new = "" Do a = a + 1 rnd_s = Int(Rnd * comp + 1) pass_new = pass_new + Chr(component(rnd_s)) Loop Until a = pass_sym 'Сравнение паролей sort = 0 Do sort = sort + 1 If pass(sort) = pass_new Then GoTo 1 Loop Until sort = i pass(i) = pass_new Loop Until i = pass_num + 1 Вот весь код. Если 1000 паролей задержка незначительна, то 5000 паролей значительная. Правда еще есть вывод который тоже задерживает. Но наибольшая задержка наверное все же тут. |
Сообщ.
#7
,
|
|
|
Не бойся? не повторятся, если ты конечно хорошие пароли генерируешь, а не 4-х символьные )
Ну ты и замутил ) У тебя кругом изврат в коде. Самые сильные тормоза в месте склеивания строк: pass_new = pass_new + Chr(component(rnd_s)) |
Сообщ.
#8
,
|
|
|
Цитата SCINER @ Не бойся не повторятся, если ты конечно хорошие пароли генерируешь, а не 4-х символьные ) Ну ты и замутил ) Папроли 8-10 символов. На таких тестирую. Включены a-z/A-Z/0-9 можно менять состав, особой разницы не будет. pass_new = pass_new + Chr(component(rnd_s)) А как это по другому сделать? массив component содержит все включенные символы - возможно это можно как то переделать. Потому и Chr(component(rnd_s)). |
Сообщ.
#9
,
|
|
|
1000 и 1 способ, хотябы так, и то лучше. Многое перекладывается на оптимизированные коды программистов M$ =)
Option Explicit Dim component() As Long Private Sub Form_Load() Dim i As Long Dim pass As Collection Dim max As Long Dim B() As Byte Dim j As Long Dim maxlen As Long Dim minLen As Long Dim dwLen As Long Dim Dic() As Byte Dim DicCount As Long max = 25000 minLen = 8 maxlen = 10 Dic = StrConv("abcdefgjiklmnopqrstuvwxyz0123456789", vbFromUnicode) DicCount = UBound(Dic) Set pass = New Collection Randomize For i = 0 To max - 1 dwLen = (maxlen - minLen) * Rnd + minLen ReDim B(dwLen) For j = 0 To dwLen B(j) = Dic(Rnd * DicCount) Next If Not Add2Collection(pass, StrConv(B, vbUnicode)) Then i = i - 1 Next Me.Caption = pass(Rnd * max) End Sub Function Add2Collection(Col As Collection, ByVal szValue As String) As Boolean On Error Resume Next Call Err.Clear Call Col.Add(szValue, "k" & szValue) Add2Collection = Err.Number = 0 End Function |
Сообщ.
#10
,
|
|
|
SCINER, спасибо, посмотрю что это такое. И адаптирую под себя.
|
Сообщ.
#11
,
|
|
|
Если скорость - критическое значение, то нужно подумать о форматировании списка паролей в спецаильну базу для быстрой выборки. По сути это список с хитрой структурой.
Где возожно использовать указатель на строку а не саму строку, что-бы избегать лишнего копирования. |
Сообщ.
#12
,
|
|
|
For i = 1 To pass.Count frmMain.txtListKey.Text = frmMain.txtListKey.Text + pass(i) + vbNewLine Next Вот этот цикл хоть и выводин в TextBox все эти пароли, все же не делает перевода строки. При попытке вывести pass.count все срабатвает. Он каждый раз на новой строчке выводит количество строк в коллекции pass В свойствах TextBox стоит multiline=true Никак не могу понять почему он не делает перенос при попытке вывести все пароли в это поле. |
Сообщ.
#13
,
|
|
|
vbCrLf - для контролов Text только эта константа.
Ну и, с точки зрения быстродействия - или использовать какой-нибудь Listxx.Add(), или сначала строку сформировать отдельно, а потом вывести в Text: S = "" For i = 1 To pass.Count S = S + Pass(i) + vbCrLf Next |