擅长:python、mysql、java
<p>使用<a href="http://docs.python.org/library/itertools.html#itertools.product" rel="noreferrer">^{<cd1>}</a>,结合<a href="http://docs.python.org/library/itertools.html#itertools.chain" rel="noreferrer">^{<cd2>}</a>将各种长度放在一起:</p>
<pre><code>from itertools import chain, product
def bruteforce(charset, maxlength):
return (''.join(candidate)
for candidate in chain.from_iterable(product(charset, repeat=i)
for i in range(1, maxlength + 1)))
</code></pre>
<p>演示:</p>
<pre><code>>>> list(bruteforce('abcde', 2))
['a', 'b', 'c', 'd', 'e', 'aa', 'ab', 'ac', 'ad', 'ae', 'ba', 'bb', 'bc', 'bd', 'be', 'ca', 'cb', 'cc', 'cd', 'ce', 'da', 'db', 'dc', 'dd', 'de', 'ea', 'eb', 'ec', 'ed', 'ee']
</code></pre>
<p>这将有效地使用输入集生成逐渐增大的单词,最大长度为maxlength。</p>
<p>不要试图生成一个包含26个字符、最长为10个字符的内存列表;而是对生成的结果进行迭代:</p>
<pre><code>for attempt in bruteforce(string.ascii_lowercase, 10):
# match it against your password, or whatever
if matched:
break
</code></pre>