使用itertools强制应用程序

时间:2014-01-02 04:25:56

标签: python itertools brute-force

我正在尝试编写一个应用程序来强制完全小写,仅限字母,6个字符长的密码,其中2个字母重复两次。我尝试使用itertools.product(string.lowercase, 6),但即使我有一台非常“强劲”的计算机,它也没有足够的RAM来完成计算,这是因为itertools实际上在返回之前构建了一个完整的列表。

那么我想到了一个像[0, 0, 0, 0, 0, 0]那样的列表,它会从右到左计数,每当索引达到26时它会回到0,而它左边的槽将增加1,除了我还没有找到一种方法来编码。

我一直在试图破解这个问题已经有一段时间了,现在转到这里是我的最后一招,任何算法提示都非常受欢迎。我很抱歉这是一个“家庭作业”类型的问题,但我真的对此感到茫然。

1 个答案:

答案 0 :(得分:3)

使用这样的东西可以在不占用太多内存的情况下工作:

import itertools
import string

for guess in itertools.product(string.lowercase, repeat=6):
    if checkguess(''.join(guess)):
        print("Password is: {0}".format(''.join(guess)))

itertools.product逐个生成可能的组合。它不返回任何东西,它是一个生成器函数。请参阅python documentationitertools中的所有函数都表现得像或处理迭代器,因此得名。

如果您的代码占用了大量内存,您可能希望在此处发布,因此我们可能会找到罪魁祸首。

根据DSM对更快代码的建议,您可以执行以下操作:

import string
from itertools import product, combinations, permutations

for guess_chars in combinations(string.lowercase, 4):
    for doubled_chars in combinations(guess_chars, 2):
        for guess in permutations(guess_chars + doubled_chars):
            #...