TL; DR : y = 2.408 * len(var_text)
Предположим, что ваш пароль - это строка символов с 256 доступными символами (0-255). Тогда как 16-битное число содержит 65536 чисел (2 ** 16), перестановки строки равной длины будут
n_perms = 256**len(passkey)
Если вы хотите количество (десятичных) цифр в n_perms, рассмотрите логарифм:
>>> from math import log10
>>> log10(1000)
3.0
>>> log10(9999)
3.9999565683801923
>>>
Итак, у нас есть length = floor(log10(n_perms)) + 1
. В питоне int
все равно округляется, поэтому я бы сказал, что вы хотите
n_perms = 256**len(var_text)
length = int(log10(n_perms)) + 1
Я бы сказал, что «укорочение» некрасивого кода не всегда является лучшим способом - вы хотите, чтобы было ясно, что вы делаете.
Редактировать : При дальнейшем рассмотрении я понял, что выбор Base-10 для определения длины ваших перестановок в любом случае действительно произвольный - так почему бы не выбрать Base-256!
length = log256(256**len(var_text)
length = len(var_text) # the log and exp cancel!
Вы просто находите длину своего пароля в другой базе ...
Редактировать 2 : Отойди, я собираюсь попробовать математику!
if x = len(var_text), we want y such that
y = log10(256**x)
10**y = 256**x
10**y = (10**log10(256))**x
10**y = (10**(log10(256)x))
y = log10(256) * x
Итак, как это для краткости:
length = log10(256) * len(var_text) # or about (2.408 * x)