powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
25 сообщений из 188, страница 5 из 8
Тяпничный pwdgen
    #38810025
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВопрос возникает: сгенерил ты последовательность из триллиона триллионов паролей, но они последовательно идут, т.е. узнал сегодняшний - быстро подобрал вчерашний. Надо перемешивать или выбирать случайный, т.е. надо хранить все и удалять использованные.
Стандартный когруэнтный генератор rand() который мы используем повсеместно
практически обеспечивает то что мне надо. Компактный. Его состояние - это
суть целое число. Для инстанциирования достаточно сделать ему seed(..), или srand(..)
и он побежит от этого числа дальше по кругу.

Единственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

Вопрос насколько она будет хороша с точки зрения случайности - пока
открыт. Я не знаю. Но возможно для данной задачи и сойдет.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устал постить простыни. Вот сорц .
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TВопрос возникает: сгенерил ты последовательность из триллиона триллионов паролей, но они последовательно идут, т.е. узнал сегодняшний - быстро подобрал вчерашний. Надо перемешивать или выбирать случайный, т.е. надо хранить все и удалять использованные.
Стандартный когруэнтный генератор rand() который мы используем повсеместно
практически обеспечивает то что мне надо. Компактный. Его состояние - это
суть целое число. Для инстанциирования достаточно сделать ему seed(..), или srand(..)
и он побежит от этого числа дальше по кругу.
т.е. сгенерить, сохранить, а потом выбирать рандомно. Отлично, но от "сохранить" не избавились.

maytonЕдинственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

Вопрос насколько она будет хороша с точки зрения случайности - пока
открыт. Я не знаю. Но возможно для данной задачи и сойдет.
Совсем нехорошо, взлом немного усложняет, надо дополнительно разгадать алгоритм перестановки. Это несложно если есть десяток последовательно сгенеренных паролей.

А как такую мысль оценишь: метод от обратного, раз уж ты хранишь использованные пароли, то может просто генерить рандомно, а потом проверять что пароль раньше не использовался?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСовсем нехорошо, взлом немного усложняет, надо дополнительно разгадать алгоритм перестановки. Это несложно если есть десяток последовательно сгенеренных паролей.
На счет десятка погорячился, посложнее, сходу не придумаю как, но интуиция подсказывает что кому надо этот ребус разгадает.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСовсем нехорошо, взлом немного усложняет, надо дополнительно разгадать алгоритм перестановки. Это несложно если есть десяток последовательно сгенеренных паролей.

А как такую мысль оценишь: метод от обратного, раз уж ты хранишь использованные пароли, то может просто генерить рандомно, а потом проверять что пароль раньше не использовался?
На самом деле и не усложняет и не упрощает. Просто если перебирать их
последовательно то велика вероятность что первые фазы работы
переборщика будут холостые. Ну просто нет паролей из нулей 0000000
или букв aaaaaa. Тут есть еще другая тема. Если есть возможность
подбирать "близость" пароля то уж точно надо бить его рандомно.
Как в генентических алгоритмах. Кидать случайно хромосомы
и смотреть какая лучше пригодилась. Впрочем это фантазии.

По поводу хранения.

Да нет. Не храню я их нигде. Они уходят в другую тулзу. Которая их проверяет на пригодность.
Как - это уже другой вопрос в другой топик. И та тулза тоже не хранит. Не ее это функции.

По сути как я себе представлял хранение. Запускаем параллельный Thread/Process который хотя-бы раз
в минуту сбрасывает *buf в файлик /var/pwdgen/state. И всё чики-пики.

Случайный пьяный электрик мне не страшен.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810248
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, я понял ваш код.

каждый раз после формирования новой комбинации, происходит проверка
Код: plaintext
1.
while (num_size <= max_len) 

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

В этом участке кода

Код: plaintext
1.
2.
		for (size_t i = num_size; i != 0; --i) {
			size_t d = i - 1;



в дальнейшем, вы ни разу не используете i, потому лучше заменить этот участок на следующий(мне так показалось, вам виднее)
Код: plaintext
1.
		for (size_t d = num_size-1; d>= 0; --d) {



У вас произойдёт 1 лишний realloc.


несмотря на всё это, ваш алгоритм имеет более общий характер чем мой. Единственно что не понял, эти строчки. Зачем они ?

Код: plaintext
1.
2.
		if ((progress & 0xFFFFFF) == 0)
			fprintf(stderr, "%lu\n", progress);
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810249
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryЕсли адрес не принадлежит тем адресам, по которым выделена память, то мы получаем undefined behaviour, потому, если мы получаем истинный результат, не факт что он действительно истинный. Хотя если получаем ложный, то наверняка знаем что он ложный. Интересное свойствоUB будет, если _читать_ данные из указателя, который не принадлежит к выделенному куску памяти. Для сравнения чтение не требуется. И, конечно, если мы получили истинный результат, то это факт, что он действительно истинный, из этого адреса можно читать без всяких там UB. Иначе программирование в принципе не возможно.


простите, но это не так

Anatoly Moskovsky Dima T, SashaMercury

Согласно стандарту, указатель может указывать либо в аллоцированный объект, либо сразу за (в следующий за объектом байт).
(Если платформа не позволяет хранить указатели за пределы выделенной памяти, то имплементация должна выделять на 1 байт больше)

Все операции, в результате которых получаются указатели за пределами какого либо выделенного объекта (перед либо более 1 байта после) - это UB. Как и сравнение <, > с такими указателями
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810253
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryВремя, требуемое на выполнение можно рассчитать, и вывести общую формулу.Мне кажется что потребуется минимум несколько лет, или столетий в крайних случаях. С кодом тоже завтра буду разбираться..засыпаю.
pwd из 20 символов - это маргинальный пример которого я надеюсь никогда
не будет.

P.S. Что у тебя за часовой пояс?
Если 20 не будет никогда, то значит будет 19.
Если x количество вариантов на одну позицию, то мы получаем вариантов. Пусть 1 символ занимает y Байт, тогда мы имеем Байт информации.

Пусть, x=26,y=1, тогда имеем Байт=Байт >4ЙБ. Поправьте, если я где-то ошибся.

PS
GMT+10
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810276
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonпропущено...

pwd из 20 символов - это маргинальный пример которого я надеюсь никогда
не будет.

P.S. Что у тебя за часовой пояс?
Если 20 не будет никогда, то значит будет 19.
Если x количество вариантов на одну позицию, то мы получаем вариантов. Пусть 1 символ занимает y Байт, тогда мы имеем Байт информации.

Пусть, x=26,y=1, тогда имеем Байт=Байт >4ЙБ. Поправьте, если я где-то ошибся.

PS
GMT+10

немного ошибся. При максимальное длине строки в 19 символов, x-количество вариантов, y-количество Байт одного символа, получаем поток в
Пересчитаю для случаев, когда пароль равен 12 символам, и x=26,y=1 тогда имеем поток в . Это чуть менее 1 Эиб, или около ТБ.

Сколько времени будет формироваться такой поток?(не говорю о том что его нужно хранить)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810278
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посчитал, если за 1 секунду будет обрабатываться 1 Гб информации, то для случая из 12 символов, и 26 вариантов для каждого символа, мы получим 34 года
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕдинственное требование - неповторяемость значений в него не заложены.
Что-ж. Можно создать свой собственный. Например взяв обычный счётчик
и поменяв местами в нём все биты. Получим циклическую уникальную
последовательность? Ответ - да. Получим.

Вопрос насколько она будет хороша с точки зрения случайности - пока
открыт. Я не знаю. Но возможно для данной задачи и сойдет.
С точки зрения случайности не очень, т.к. половина соседних значений будут отличаться одним битом, четверть двумя и т.д.
Вот если придумать такую функцию которая изменит хотя бы треть битов у соседних значений, тогда со случайностью будет получше.
Но и это не панацея, т.к. достаточно расковырять твой EXE, понять алгоритм и готово.

ИМХУ для паролей все-таки лучше ГСЧ и пусть повторы будут.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСколько времени будет формироваться такой поток?(не говорю о том что его нужно хранить)
Вот блин опять двадцать пять. Мои ответы никто не читает. Никто этот поток не хранит! И не будет хранить.
И 19 символов - это крайность. Общий случай с паролем из префикса и двух цифр я описал выше.

Ох уж эти часовые пояса.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810384
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, всё читаю )

так и не говорю, что они должны храниться, очевидно не должны, а говорю только про то время, что они будут формироваться. Если за секунду вы будете обрабатывать 1 Гб информации, то на все возможные варианты из 12 символов (26 вариантов на каждый), уйдёт 34 года ).
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810385
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпростите, но это не так
Anatoly Moskovsky Как и сравнение <, > с такими указателямив нашем случае сравнение обратное. Тестируемый указатель сравнивается с заведомо правильными, поэтому никакого UB. Если он лежит в допустимых пределах, то из него можно читать, если нет - то нельзя. И в чём же заключается твоё "не так"?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810386
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкаждый раз после формирования новой комбинации, происходит проверка
Код: plaintext
1.
while (num_size <= max_len) 


. Учитывая то, сколько этих комбинаций планируется, мне показалось это слишком затратно.
Да, можно легко убрать это сравнение, если вычислять пароли отдельно для каждой длины .
Но мне было лень :)
SashaMercuryВ этом участке кода

Код: plaintext
1.
2.
		for (size_t i = num_size; i != 0; --i) {
			size_t d = i - 1;


в дальнейшем, вы ни разу не используете i, потому лучше заменить этот участок на следующий(мне так показалось, вам виднее)
Код: plaintext
1.
		for (size_t d = num_size-1; d>= 0; --d) {


Второй вариант некорректный, т.к. size_t беззнаковый и условие выхода никогда не выполнится.
Правильно так:
Код: plaintext
1.
for (size_t d = num_size-1; d != ~0u; --d)

или так
Код: plaintext
1.
for (size_t d = num_size-1; d < num_size; --d)


Но оба эти варианта для меня не сильно читаемы.

Я лично не вижу никаких проблем с тем что i используется только для условия цикла.
Такой вариант как у меня мне больше нравится с точки зрения читаемости.
А с точки зрения дублирования кода - компилятор такие конструкции вполне успешно оптимизирует.
После оптимизации получится что-то типа:
Код: plaintext
1.
2.
3.
4.
for(size_t d = num_size; d;) {
  --d;
  // тело цикла
}


Я иногда и сам так пишу обратный цикл :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810400
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810413
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСколько времени максимум вы предполагаете на полный перебор
Копать от меня и до обеда :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810445
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonm_Sla, ОК. Пожалуй сделаю бранч утилиты. Будет два направления. Рекурсивное и Tricky-численное.на с++ накидал черновой вариант
умеет работать в несколько потоков, пишет сразу в файлы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
//
//  tricky_number.h
//

#ifndef TRICKY_NUMBER_H
#define TRICKY_NUMBER_H

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <cstring>


using namespace std;

//===============================
//
class alphabet
{
    public:
        vector<string> alphabet;
};
//===============================
//
class digit
{
    public:
        size_t value;
        alphabet alphabet_digit;
        digit(size_t ini) { value = ini; }
};
//===============================

class tricky_number
{
    public:
        vector<digit> num;
        string output_file_name;
        unsigned __int64 i;
        unsigned __int64 max_i;
        size_t current_thread;
        size_t max_thread;
        size_t work;

        tricky_number();
        virtual ~tricky_number();

        void ini_alphabet(size_t par_max);
        void ini(size_t min, size_t max, size_t current_thread, size_t max_thread, string output_file_name);
        void run();


    protected:
        void out_num(ofstream *file);
        void print_num();
        void add_num();
        void dec_to_tricky_number(unsigned __int64 dec);
        unsigned __int64 pow(unsigned __int64 base, size_t exponent);

    private:

};

#endif // TRICKY_NUMBER_H

//
//  main.cpp
//

#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
#include <process.h>

#include "tricky_number.h"

using namespace std;

vector<string> sym_set;

string alpha        = "abcdefghijklmnopqrstuvwxyz";
string upper        = "ABCDEFGHIJLKMNOPQRSTUVWXWY";
string xdigits      = "0123456789ABCDEF";
string digits       = "0123456789";
string punct        = "!@#$%^&*()-=_+,./?~`\\|";

vector<tricky_number> nums;

tricky_number *threads[256]; // максимум 256 потоков

size_t min_len = 6;
size_t max_len = 6;

//////////////////////////////////////////
void string_to_vector(vector<string> *vec, const string &str)
{
    for(size_t i=0; i < str.size(); i++)
    {
        vec->push_back(string(1,str[i]));
    }
}
//////////////////////////////////////////
// запуск потока
void Run(void * i)
{
    threads[(int)i]->run();
}
//////////////////////////////////////////
int main(int argc,char **arg, char **env)
{
    // работаем в 3 потока
    nums.resize(3);

    // определяем алфавит для каждого разряда
    for(size_t i=0; i < nums.size(); i++)
        nums[i].ini_alphabet(max_len);

    sym_set.clear();
    string_to_vector(&sym_set, alpha);
    for(size_t k=0; k < nums.size(); k++)
        for(size_t i = 0, max_i = nums[k].num.size(); i < max_i; i++)
            nums[k].num[i].alphabet_digit.alphabet = sym_set;

    // определяем параметры
    for(size_t i=0; i < nums.size(); i++)
        nums[i].ini(min_len, max_len, i+1, nums.size(), "out_");

    // запускаем потоки
    for(size_t i=0; i < nums.size(); i++)
    {
        threads[i] = &nums[i];
        _beginthread( Run, 10000, (void *) i );

    }

    // ждем завершения потоков
    size_t work;
    do
    {
        Sleep(100);
        work = 0;
        for(size_t i=0; i < nums.size(); i++)
            work += nums[i].work;

    }while(work);

    return 0;
}
//////////////////////////////////////////


//
//  tricky_number.cpp
//

#include "tricky_number.h"

//////////////////////////////////////////
tricky_number::tricky_number()
{
    //
}
//////////////////////////////////////////
tricky_number::~tricky_number()
{
    //
}
//////////////////////////////////////////
// увеличиваем "хитрое" число на 1
void tricky_number::add_num()
{
    size_t i = 0;
    bool carry = false;

    do{
        num[i].value++;
        if(num[i].value > num[i].alphabet_digit.alphabet.size())
        {
            num[i].value = 1;
            carry = true;
        }
        else
        {
            carry = false;
        }

        i++;
    }while(carry);
}
//////////////////////////////////////////
void tricky_number::print_num()
{
    char str[256];
    str[0]=0;

    size_t i = 0;
    while(num[i].value && num.size() > i)
    {
        strcat(str, num[i].alphabet_digit.alphabet[num[i].value - 1].c_str());
        i++;
    }

    strcat(str,"\r\n");

    cout << str << endl;

}
//////////////////////////////////////////
// вывод в файл
void tricky_number::out_num(ofstream *file)
{
    string str;

    size_t i = 0;
    while(num[i].value)
    {
        str += num[i].alphabet_digit.alphabet[num[i].value - 1];
        i++;
    }

    str+="\r\n";

    file->write(str.c_str(),str.size());
}
//////////////////////////////////////////
void tricky_number::ini_alphabet(size_t par_max)
{
    num.resize( par_max + 1, 0);
}
//////////////////////////////////////////
unsigned __int64 tricky_number::pow(unsigned __int64 base, size_t exponent)
{
    __int64 rez = 1;

    for(size_t i = 0; i < exponent; i++)
        rez*=base;

    return rez;
}
//////////////////////////////////////////
void tricky_number::ini(size_t par_min, size_t par_max, size_t par_current_thread, size_t par_max_thread, string par_output_file_name)
{
    work = 0;

    char number[256];
    itoa(par_current_thread, number, 10);

    output_file_name = par_output_file_name + number + ".lst";
    current_thread = par_current_thread;
    max_thread = par_max_thread;

    // выводим чило в цикле
    // while(i < max_i) ВыводЧисла();
    // рассчитываем i и max_i  в зависимости от par_min, par_max
    i = 0;
    for(int k=0; k < par_min-1; k++)
        i += pow(num[k].alphabet_digit.alphabet.size(), k+1);

    max_i = 0;
    for(size_t i=0; i < par_max; i++)
        max_i += pow(num[i].alphabet_digit.alphabet.size(), i+1);

    //cout << "min = " << i << endl;
    //cout << "max = " << max_i << endl;

    // Корректируем i и max_i в зависимости от текущего потока
    unsigned __int64 delta = (max_i - i) / max_thread + 1;
    unsigned __int64 add = i;
    if( ((current_thread - 1)*delta + add) > max_i)
        i = max_i;
    else
        i = (current_thread - 1)*delta + add;

    if( ((current_thread - 1)*delta + delta + add + 1) < max_i )
        max_i = (current_thread - 1)*delta + delta + add + 1;

    //cout << "min = " << i << endl;
    //cout << "max = " << max_i << endl;

    dec_to_tricky_number(i + 1); //устанавливаем "хитрое" число
    //print_num();
    cout << endl;
}
//////////////////////////////////////////
void tricky_number::run()
{
    work = 1;

    ofstream outfile(output_file_name.c_str(), std::ofstream::binary);
    cout << "Start: " << output_file_name << endl;

    while(i < max_i)
    {
        out_num(&outfile);
        add_num();

        i++;
    }

    cout << "End: " << output_file_name << endl;
    //print_num();

    outfile.close();
    work = 0;
}
//////////////////////////////////////////
void tricky_number::dec_to_tricky_number(unsigned __int64 dec)
{
    size_t k=0;

    do
    {
        num[k].value = (dec % num[k].alphabet_digit.alphabet.size());
        dec /= num[k].alphabet_digit.alphabet.size();
        k++;

    }while(dec);
}
//////////////////////////////////////////

при работе в 2 потока примерно в 2 раза медленнее твоего варианта (надо оптимизировать)
вечером попробую дома на 8 потоках запустить
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
Я предлагаю сейчас не обсуждать этот вопрос. Пятничный хакатон который я предложил
вобщем-то не имел такого глубокого исследовательского смысла.

Любой из вас знает какой длины пароли требуются для соц-сетей и корпоративных доменов.
Тут речи нет. И любой из вас знает как вы сами генерируете пароли когда нет ограничений.
И какие пароли вы придумываете для .zip архивов.

Я предложил тему и дал ей возможность развиваться. Про 19 и 20 символов и про хранение
гигабайтов вы уже додумали сами.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaпри работе в 2 потока примерно в 2 раза медленнее твоего варианта (надо оптимизировать)
вечером попробую дома на 8 потоках запустить
Запускай из консоли с опциями

Код: plaintext
1.
2.
> start /AFFINITY 0x01 pwdgen ...
> start /AFFINITY 0x02 pwdgen ...



Данная задача удобна тем что в ней почти нет синхронизации. Есть порции задач которые
можно делать независимо. Идеальный хадуп.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810656
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810818
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercurymayton,
скажите пожалуйста, какая предполагается реальная максимальная длина строки, и количество вариантов на каждую позицию ?
Сколько времени максимум вы предполагаете на полный перебор всех вариантов при заданных ограничениях?
Я предлагаю сейчас не обсуждать этот вопрос. Пятничный хакатон который я предложил
вобщем-то не имел такого глубокого исследовательского смысла.

Любой из вас знает какой длины пароли требуются для соц-сетей и корпоративных доменов.
Тут речи нет. И любой из вас знает как вы сами генерируете пароли когда нет ограничений.
И какие пароли вы придумываете для .zip архивов.

Я предложил тему и дал ей возможность развиваться. Про 19 и 20 символов и про хранение
гигабайтов вы уже додумали сами.

меня нет в соцсетях нет, потому не знаю. А в организациях известно какие пароли Зима@2014, Лето@2014 и т.д.

Вот для zip пожалуй пойдет. Я недавно книжку скачал, но чтобы её распаковать нужен пароль.
Тема хорошая, не спорю :))
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810822
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот видишь. Зима... Летто.. @ и четыре цифирки.

Я знавал одного админа который IP в пароль трансформировал. Хитрец блин... Но я-то об этом тоже знал
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810833
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

может быть это стандартная конструкция, дублирования переменной типа size_t в цикле, но человеку приходится тратить больше времени чтобы понять зачем эта новая переменная. Потому и спросил. Буду знать, если ещё раз встречу цикл по size_t переменной
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38810845
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryпростите, но это не так
пропущено...
в нашем случае сравнение обратное. Тестируемый указатель сравнивается с заведомо правильными, поэтому никакого UB. Если он лежит в допустимых пределах, то из него можно читать, если нет - то нельзя. И в чём же заключается твоё "не так"?

Нельзя сравнивать один некорректный адрес памяти и один корректный..Позже я составлю отдельный топик..
...
Рейтинг: 0 / 0
25 сообщений из 188, страница 5 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]