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

Код: 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
Тяпничный pwdgen
    #38806698
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$ python -c "import string;import random;print ''.join(random.choice(string.ascii_lowercase) for _ in range(random.choice([2, 3])))"
rkm
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38806739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорт. На сях давай.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38806827
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тяпничный pwdgen
    #38807095
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Пришёл только, я бы так делал

// 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
Тяпничный pwdgen
    #38807097
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неправильно делаю, что каждый раз считаю длину строки, надо передавать её. Один раз посчитать, а затем передавать.
писал в полной темноте, и у меня пол экрана не работает ( Потому и алгоритм Анатолия не понял, в понедельник прочитаю нормально. Доброго времени суток :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807346
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryписал в полной темноте, и у меня пол экрана не работает
Напомнило мне, как у меня 20 лет назад на ноуте в шине диска переломился проводник, и в каждом 16-битном слове считанном с жесткого диска один из битов был установлен в 1.
Поскольку денег на ремонт не было, а руки слишком кривы для паяльника, пришлось написать загрузчик,который не использовал этот бит в машинных инструкциях, и драйвер диска который переупаковывал биты отображая диск в виртуальный диск меньшего размера.

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

ЗЫ. А где mayton? Свой вариант кто будет приводить? :)
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807410
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня щас вообще нет варианта. Но думаю сейчас сделаем гибрид из того что уже опубликовано. Если сообщество
не против
Чистить будем. У Толика - СТЛ. У Сашки - куча каких-то memcpy.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807449
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonИ чтоб букв было много. Не 3 а вобщем много.
Ты прикинул сколько комбинаций получается? Если только малые английские буквы то 26^N, где N количество символов. Например для 8 символов уже 208 миллиардов комбинаций.
Да.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807452
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тяпничный pwdgen
    #38807455
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, круть! Спс.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807463
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе мой вариант
Код: 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
Тяпничный pwdgen
    #38807469
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тяпничный pwdgen
    #38807477
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

Тут немного другое требуется.
Вместо того чтобы сгенерировать ровно один случайный пароль, как делает эта программа (и однострочник в первом ответе), надо сгенерировать ВСЕ пароли из заданного множества.
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807739
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тяпничный pwdgen
    #38807742
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так можно.

Код: 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
Тяпничный pwdgen
    #38807749
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объединил стартовое значение и условие выхода в одну строку, чтобы операций аллоцирования и освобождения памяти было меньше. Всё, больше оптимизировать не буду, осталось одно узкое место, очевидно 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
Тяпничный pwdgen
    #38807751
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSА вот функцию вполне могу составить
которая будет определять размер файла, в зависимости от диапазона.

SSЗаймусь наконец алгоритмами Анатолия и Дмитрия
...
Рейтинг: 0 / 0
Тяпничный pwdgen
    #38807766
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тяпничный pwdgen
    #38807783
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

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

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


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