Генератор сложных паролей

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Всем доброго дня. Помогите решить задачку.
Нужно написать так скрипт, что бы изначально в инпут,пользователь задавал кол-во символов. После чего программа бы считала Макс. Кол-во комбинаций из цифр,букв нижнего и верхнего регистров.

Так вот. Это все нужно делать через модуль random? С использованием random.alpha и тд?
Как заранее вывести кол-во комбинаций если цикл ещё не отработал?
 
  • Мне нравится
Реакции: Student

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Добро пожаловать в мир дискретной математики. А точнее сочетания с повторениями на Python.

Вот формула:
combinations.png

Вот реализация на Python:
Python:
import math

def nCr(n, r):
    f = math.factorial
    return int(f(n + r - 1) / (f(r) * f(n - 1)))

Можно, конечно, пойти дебильным путем и считать все комбинации при помощи itertools.combinations_with_replacement тогда будут видны все комбинации:
Python:
import itertools
import string

password_len = int(input("Длинна пароля: "))
chars = string.ascii_lowercase + string.ascii_uppercase + string.digits
total = 0
for item in itertools.combinations_with_replacement(chars, password_len):
    print(''.join(item))
    total += 1

print(total)

Но, до программирования люди изобрели математику, и она может дать ответ быстрее:

Python:
import math
import string

def nCr(n, r):
    f = math.factorial
    return int(f(n + r - 1) / (f(r) * f(n - 1)))


password_len = int(input("Длинна пароля: "))
chars = string.ascii_lowercase + string.ascii_uppercase + string.digits

total = nCr(len(chars), password_len)
print('Всего комбинаций будет:', total)

Какой вариант выбрать?
Конечно, лучше всего выбрать дискретную математику и математический подход. Если посчитать сколько комбинаций получится используя itertools и длинна пароля будет 6 символов, то скрипт будет выполняться 10 секунд!!!

Если использовать формулу, и указать длину пароля в 30 символов, то скрипт выполнится за 0.052 секунд.

 
  • Мне нравится
Реакции: hellhyde

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Добро пожаловать в мир дискретной математики. А точнее сочетания с повторениями на Python.

Вот формула:
Посмотреть вложение 492

Вот реализация на Python:
Python:
import math

def nCr(n, r):
    f = math.factorial
    return int(f(n + r - 1) / (f(r) * f(n - 1)))

Можно, конечно, пойти дебильным путем и считать все комбинации при помощи itertools.combinations_with_replacement тогда будут видны все комбинации:
Python:
import itertools
import string

password_len = int(input("Длинна пароля: "))
chars = string.ascii_lowercase + string.ascii_uppercase + string.digits
total = 0
for item in itertools.combinations_with_replacement(chars, password_len):
    print(''.join(item))
    total += 1

print(total)

Но, до программирования люди изобрели математику, и она может дать ответ быстрее:

Python:
import math
import string

def nCr(n, r):
    f = math.factorial
    return int(f(n + r - 1) / (f(r) * f(n - 1)))


password_len = int(input("Длинна пароля: "))
chars = string.ascii_lowercase + string.ascii_uppercase + string.digits

total = nCr(len(chars), password_len)
print('Всего комбинаций будет:', total)

Какой вариант выбрать?
Конечно, лучше всего выбрать дискретную математику и математический подход. Если посчитать сколько комбинаций получится используя itertools и длинна пароля будет 6 символов, то скрипт будет выполняться 10 секунд!!!

Если использовать формулу, и указать длину пароля в 30 символов, то скрипт выполнится за 0.052 секунд.

Все супер получилось. Но вот с итерацией вот так поступил
Python:
for _ in itertools.product(chars, repeat=int(password_len)):
            total += 1
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
@hellhyde не пользуйся intertools для данной задачи. Если password_len у тебя будет равен 15 или 30, то твой скрипт зависнет на час. Сам itertools.product не возвращает все возможные комбинации. Все возможные комбинации возвращает itertools.combinations_with_replacement.

Пользуйся формулой из функции nCr которую я предоставил выше.
 
  • Мне нравится
Реакции: hellhyde

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
@hellhyde не пользуйся intertools для данной задачи. Если password_len у тебя будет равен 15 или 30, то твой скрипт зависнет на час. Сам itertools.product не возвращает все возможные комбинации. Все возможные комбинации возвращает itertools.combinations_with_replacement.

Пользуйся формулой из функции nCr которую я предоставил выше.
Да мне для задания на обучении. Такое уже приняли :)
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Что за сайт с уроками?
 

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Что за сайт с уроками?
Онлайн курсы по обучению)
Codeby
 

Форум IT Специалистов