Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничный pwdgen / 25 сообщений из 188, страница 1 из 8
14.11.2014, 16:16
    #38806596
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Вот так вот надо чтобы было.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
$ pwdgen [alpha] 2-3

aa
ab
ac
...
zzx
zzy
zzz



И чтоб букв было много. Не 3 а вобщем много.

Давайте. Кидайте идеи и сорцы. На сях.

С++ тоже приветствуется (как ни странно

P.S. С++11 ну это ваще респект будет.
...
Рейтинг: 0 / 0
14.11.2014, 17:00
    #38806698
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
$ python -c "import string;import random;print ''.join(random.choice(string.ascii_lowercase) for _ in range(random.choice([2, 3])))"
rkm
...
Рейтинг: 0 / 0
14.11.2014, 17:29
    #38806739
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Чорт. На сях давай.
...
Рейтинг: 0 / 0
14.11.2014, 19:32
    #38806827
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
mayton,

Парсить аргументы лень. Вот с прошитыми в коде параметрами.
С++ :)

Код: 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.
#include <iostream>
#include <string>
#include <vector>

char sym_set[] = "abcdefghijklmnopqrstuvwxyz";
size_t sym_set_size = sizeof(sym_set) - 1;
size_t min_len = 2;
size_t max_len = 3;

int main()
{
    std::vector<size_t> num;
    std::string symbols;
    // initial value
    num.resize(min_len, 0);
    symbols.resize(min_len, sym_set[0]);
    // increment while len within range
    while (symbols.size() <= max_len) {
        // print current value
        std::cout << symbols << std::endl;
        // num++; symbols++
        for (size_t i = num.size(); i != 0; --i) {
            size_t d = i - 1;
            ++num[d];
            if (num[d] < sym_set_size) {
                symbols[d] = sym_set[num[d]];
                break;
            }
            // carry
            num[d] = 0;
            symbols[d] = sym_set[0];
            if (d == 0) {
                // add a digit place for carry
                num.insert(num.begin(), 0);
                symbols.insert(symbols.begin(), sym_set[0]);
            }
        }
    }
    return 0;
}
...
Рейтинг: 0 / 0
15.11.2014, 16:51
    #38807095
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Здравствуйте. Пришёл только, я бы так делал

// help_Mark.cpp: определяет точку входа для консольного приложения.
//

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* get_next_string(char* cur)
{
	size_t p=strlen(cur);
	int i=0;
	while(*(cur+p-1-i)=='z')
		*(cur+p-1-i++)='a';

	*(cur+p-1-i)+=1;
	return cur;
}

int view_all_combination(size_t p,FILE* out)
{
	char* start_s=(char*)malloc(sizeof(char)*(p+1));
	memset(start_s,'a',p);
	*(start_s+p)='\0';
	char* condition_s=(char*)malloc(sizeof(char)*(p+1));
	memset(condition_s,'z',p);
	*(condition_s+p)='\0';
	fprintf(out,"%s\n",start_s);
	while(strcmp(start_s,condition_s))
	{
		fprintf(out,"%s\n",get_next_string(start_s));
	}
	return 1;
}

int view_diap(int begin,int end,FILE* out)
{
	for(int i=begin;i<=end;++i)
		view_all_combination(i,out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out=fopen("output.txt","w");
	view_diap(1,4,out);
	fclose(out);
	return 0;
}
...
Рейтинг: 0 / 0
15.11.2014, 16:55
    #38807097
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
неправильно делаю, что каждый раз считаю длину строки, надо передавать её. Один раз посчитать, а затем передавать.
писал в полной темноте, и у меня пол экрана не работает ( Потому и алгоритм Анатолия не понял, в понедельник прочитаю нормально. Доброго времени суток :)
...
Рейтинг: 0 / 0
16.11.2014, 05:32
    #38807346
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
SashaMercuryписал в полной темноте, и у меня пол экрана не работает
Напомнило мне, как у меня 20 лет назад на ноуте в шине диска переломился проводник, и в каждом 16-битном слове считанном с жесткого диска один из битов был установлен в 1.
Поскольку денег на ремонт не было, а руки слишком кривы для паяльника, пришлось написать загрузчик,который не использовал этот бит в машинных инструкциях, и драйвер диска который переупаковывал биты отображая диск в виртуальный диск меньшего размера.

Ничего, нас ##ут, а мы крепчаем :)

ЗЫ. А где mayton? Свой вариант кто будет приводить? :)
...
Рейтинг: 0 / 0
16.11.2014, 12:13
    #38807410
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
У меня щас вообще нет варианта. Но думаю сейчас сделаем гибрид из того что уже опубликовано. Если сообщество
не против
Чистить будем. У Толика - СТЛ. У Сашки - куча каких-то memcpy.
...
Рейтинг: 0 / 0
16.11.2014, 13:38
    #38807449
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
maytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
...
Рейтинг: 0 / 0
16.11.2014, 13:40
    #38807450
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Dima TmaytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
Да.
...
Рейтинг: 0 / 0
16.11.2014, 13:51
    #38807452
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
mayton,

Вот без СТЛ, на чистом С :)

Код: 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.
void gen_pass_c()
{
    char sym_set[] = "abcdefghijklmnopqrstuvwxyz";
    size_t sym_set_size = sizeof(sym_set) - 1;
    size_t min_len = 8;
    size_t max_len = 8;

    size_t progress = 0;
    size_t num_size = min_len;
    size_t* num =  (size_t*)malloc(num_size * sizeof(size_t));
    char* symbols = (char*)malloc((num_size + 1) * sizeof(char));
    // initial value
    memset(num, 0, num_size * sizeof(num[0]));
    memset(symbols, sym_set[0], num_size * sizeof(symbols[0]));
    symbols[num_size] = 0;
    // increment while len within range
    while (num_size <= max_len) {
        // print current value
        //puts(symbols);
        //putchar('\n');
        if ((progress & 0xFFFFFF) == 0)
           fprintf(stderr, "%lu\n", progress);
        // num++; symbols++
        for (size_t i = num_size; i != 0; --i) {
            size_t d = i - 1;
            ++num[d];
            if (num[d] < sym_set_size) {
                symbols[d] = sym_set[num[d]];
                break;
            }
            // carry
            num[d] = 0;
            symbols[d] = sym_set[0];
            if (d == 0) {
                // add a digit place for carry
                num_size++;
                num = (size_t*)realloc(num, num_size * sizeof(size_t));
                memmove(num + 1, num, (num_size - 1) * sizeof(size_t));
                symbols = (char*)realloc(symbols, (num_size + 1) * sizeof(char) );
                memmove(symbols + 1, symbols, (num_size - 1) * sizeof(char));
            }
        }
        progress++;
    }
}



Без вывода сгенерированных паролей и с выводом в /dev/null получаются такие скорости:
С++: 120 Мп/сек / 2.2 Мп/сек
С (моя): 375 Мп/сек /19 Мп/сек
С (Саши): 40 Мп/сек / 5.5 Мп/сек (подозреваю что strlen и printf тормозят)
...
Рейтинг: 0 / 0
16.11.2014, 13:57
    #38807455
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Anatoly Moskovsky, круть! Спс.
...
Рейтинг: 0 / 0
16.11.2014, 14:17
    #38807463
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Вот тебе мой вариант
Код: 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.
#include <windows.h>
#include <stdio.h>

char simb_first = 'a'; // Код первого допустимого символа
char simb_last = 'z'; // Код последнего допустимого символа

void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
	memset(buf, simb_first, N);
	buf[N] = 0;
	char* last = buf + (N - 1);
	// Перебор
	char* cur = last;
	bool istcho = true;
	while(istcho) {
		printf("%s\n", buf);
		// следующая комбинация
		cur = last;
		do { 
			(*cur)++;
			if(*cur <= simb_last) {
				break;
			} else {
				*cur = simb_first;
				cur--;
				if(cur < buf) {
					// все варианты перебраны
					istcho = false;
					break;
				}
			}
		} while(true);
	}
	free(buf);
}

int main(int argc, char* argv[])
{
	for(int i = 2; i <= 3; i++) {
		perebor(i);
	}
	system("pause");
    return 0;
}

...
Рейтинг: 0 / 0
16.11.2014, 14:27
    #38807469
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
5.
6.
    while (num_size <= max_len) {
...
        for (size_t i = num_size; i != 0; --i) {
...
                num = (size_t*)realloc(num, num_size * sizeof(size_t));
...



Без вывода сгенерированных паролей и с выводом в /dev/null получаются такие скорости:
...
realloc() тоже тормозит, можно сразу выделить необходимый кусок памяти.
Для комбинации N штук из M видов символов надо N*M^N байт, т.е. малые английские буквы 2-3 штуки = 2*26^2 + 3*26^3
...
Рейтинг: 0 / 0
16.11.2014, 14:51
    #38807477
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Dima T,

В моем алгоритме realloc вызывается с десяток раз максимум (макс размер пароля).
Поэтому тормозит ли он совершенно неважно :)
...
Рейтинг: 0 / 0
16.11.2014, 15:40
    #38807510
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
...
Рейтинг: 0 / 0
16.11.2014, 19:18
    #38807628
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
nik_x,

Тут немного другое требуется.
Вместо того чтобы сгенерировать ровно один случайный пароль, как делает эта программа (и однострочник в первом ответе), надо сгенерировать ВСЕ пароли из заданного множества.
...
Рейтинг: 0 / 0
17.11.2014, 02:18
    #38807739
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Anatoly Moskovsky,

вот вариант исключающий ту ошибку, о которой я писал ранее



Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* get_next_string(char* cur,size_t p)
{
	int i = 0;
	while (*(cur + p - 1 - i) == 'z')
		*(cur + p - 1 - i++) = 'a';

	*(cur + p - 1 - i) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(start_s, 'a', p);
	*(start_s + p) = '\0';
	char* condition_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(condition_s, 'z', p);
	*(condition_s + p) = '\0';
	fprintf(out, "%s\n", start_s);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", get_next_string(start_s,p));
	}
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



но тут ещё можно оптимизировать. Сейчас
...
Рейтинг: 0 / 0
17.11.2014, 02:32
    #38807742
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Вот так можно.

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* set_next_string(char* cur,size_t p)
{
	while (*(cur + p - 1) == 'z')	
		*(cur + p-- - 1) = 'a';

	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(start_s, 'a', p);
	*(start_s + p) = '\0';
	char* condition_s = (char*)malloc(sizeof(char)*(p + 1));
	memset(condition_s, 'z', p);
	*(condition_s + p) = '\0';
	
	fprintf(out, "%s\n", start_s);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", set_next_string(start_s,p));
	}
	free(start_s);
	free(condition_s);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



Анатолий, вы можете ещё раз пожалуйста проверить на скорость ?
...
Рейтинг: 0 / 0
17.11.2014, 02:50
    #38807749
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Объединил стартовое значение и условие выхода в одну строку, чтобы операций аллоцирования и освобождения памяти было меньше. Всё, больше оптимизировать не буду, осталось одно узкое место, очевидно strcmp. Думаю, нужно это вопрос по другому решать, т.е. запускать программу, но проверку на завершение программы не делать, а проверять например размер файла, каждую секунду (нужно провести оценку размера файла, от диапазона). Только как это сделать, я не знаю. А вот функцию вполне могу составить. Как вы считаете, такое предложение имеет место быть ?

Код: 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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* set_next_string(char* cur,size_t p)
{
	while (*(cur + p - 1) == 'z')	
		*(cur + p-- - 1) = 'a';

	*(cur + p - 1) += 1;
	return cur;
}

int view_all_combination(size_t p, FILE* out)
{
	char* start_and_condition = (char*)malloc((p + 1)*2);
	memset(start_and_condition, 'a', p);//стартовое значение
	*(start_and_condition + p) = '\0';
	char* start_s = start_and_condition;
	memset(start_and_condition+p+1, 'z', p);//условие выхода
	*(start_and_condition + 2 *p + 1) = '\0';
	char* condition_s = start_and_condition + p + 1;
	
	fprintf(out, "%s\n",start_and_condition);
	while (strcmp(start_s, condition_s))
	{
		fprintf(out, "%s\n", set_next_string(start_s,p));
	}
	free(start_and_condition);
	return 1;
}

int view_diap(int begin, int end, FILE* out)
{
	for (int i = begin; i <= end; ++i)
		view_all_combination(i, out);
	return 1;
}

int main(int argc, char** argv)
{
	FILE* out = fopen("output.txt", "w");
	view_diap(1, 4, out);
	fclose(out);
	return 0;
}



Займусь наконец алгоритмами Анатолий и Дмитрия C:
...
Рейтинг: 0 / 0
17.11.2014, 02:53
    #38807751
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
SSА вот функцию вполне могу составить
которая будет определять размер файла, в зависимости от диапазона.

SSЗаймусь наконец алгоритмами Анатолия и Дмитрия
...
Рейтинг: 0 / 0
17.11.2014, 04:35
    #38807766
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Dima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void perebor(int N) // все комбинации N символов
{
	// Инициализанция
	char* buf = (char*)malloc(N + 1);
        char* last = buf + (N - 1);
	// Перебор
	char* cur = last;
	
...			
	if(cur < buf) 
}



такая операция законна ?
...
Рейтинг: 0 / 0
17.11.2014, 06:54
    #38807783
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Anatoly Moskovsky,

теперь я понял почему вы использовали частные случаи fputs и putc, они быстрее чем fprintf
...
Рейтинг: 0 / 0
17.11.2014, 07:13
    #38807785
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
SashaMercuryтакая операция законна ?
Что незаконного? Сравнение значений двух указателей.
Без разницы как перебирать массив: от начала к концу и проверять выход за конец или наоборот, он конца к началу и проверять выход перед началом.
...
Рейтинг: 0 / 0
17.11.2014, 07:40
    #38807792
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничный pwdgen
Dima T,

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


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