Как размер моей подстроки растет, как я могу найти сложность этого раздела кода?Какова сложность хеш-функции sha1
if size > 160:
sub = (hashlib.sha1(sub.encode('utf-8')).hexdigest())
Мне стало любопытно, когда я заметил, что моя программа работает так, как если бы хеш-функция выполнялась в постоянное время. Для моей программы, если «размер» равен 165, в худшем случае вышеуказанный код выполнит 165х. Тест, который я только что сделал, показывает, что sha1 выполняется с неустойчивыми отношениями с длиной.
Length Time
0 0
1 0.015000105
2 0.016000032
3 0.046000004
4 0.046999931
5 0.062000036
6 0.078000069
7 0.078000069
8 0.07799983
9 0.108999968
код тест:
import string
import random
import hashlib
import time
def randomly(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
for i in range(1, 10000001, 1000000):
random_str = randomly(i)
start = time.time()
str_hash = hashlib.sha1(random_str.encode('utf-8')).hexdigest()
print time.time() - start
Я думаю, что сложность можно рассматривать как линейные, не наступайте функцию. Дополнительные пояснения в моем ответе ниже – ZZY
Сложность линейна, но время выполнения является ступенчатой функцией, поскольку фактическое количество обработанных бит или фрагментов является ступенчатой функцией размера ввода. Но я согласен с вашей оценкой в том, что этот эффект должен быть незначительным для огромных размеров блоков в более позднем тесте. Я полностью забыл о размере. Спасибо, что указали это. – DarthGizka