繁体   English   中英

时间复杂度Python脚本

[英]Time Complexity Python Script

我正在编写一个猜测数字密码(包括带有前导零的密码)的小脚本。 脚本运行良好,但是我很难理解该算法在最坏情况下的时间复杂度。 谢谢,对这种实现的复杂性有任何见解。

def bruteforce(cipherText):
    for pLen in itertools.count():
        for password in itertools.product("0123456789", repeat=pLen):
            if hashlib.sha256("".join(password)).hexdigest() == cipherText:
                return "".join(password)

首先,总是有可能在找到正确的密码之前先找到哈希冲突。 而且,对于足够长的输入字符串,这是可以保证的 因此,实际上,该算法是恒定时间的:无论输入什么,它都将以大约2^256步的速度完成。

但是,当您询问如何使用更合理的N缩放时,这并不是很有帮助。因此,假设在哈希冲突不相关的情况下,我们有一个足够低的上限。

现在,如果密码的长度为N,则外部循环将运行N次。*

*我假设这里的密码真的是纯数字。 当然,否则,它将无法在N处找到正确的答案,并继续进行下去,直到找到哈希冲突为止。

内循环需要多长时间? 好吧,它的主要作用是迭代product("0123456789", repeat=pLen)每个元素。 这只是迭代10个元素列表的pLen次的笛卡尔乘积-换句话说, 10^pLen中有10^pLen元素。

由于10**pLen大于sum(10**i for i in range(pLen)) (例如100000 > 11111 ),我们可以忽略除最后一次通过外循环的所有时间,因此10**pLen为内部循环的总数。

它在每个内部循环中执行的操作都是线性的,在pLenjoin字符串,对字符串进行散列)或常量(比较两个散列)上是线性的,因此总共有(10 ^ pLen)* pLen个步骤。

因此,最坏情况下的复杂度是指数级的: O(10^N) 因为这与将N乘以一个常数然后执行2^cN相同,所以它的复杂度级别与O(2^N)

如果要将两者结合在一起,则可以将此称为O(2^min(log2(10)*N, 256)) 同样,它是恒定时间的(因为渐近线仍然是2^256 ),但是显示了如果只关心较小的N实际上是指数的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM