<p><strong>解决方案在底部</strong></p>
<hr/>
<p>你很亲密。你想要的是。。。在</p>
<pre><code>mystring = "abcdefghijklmnopqrstuvwxyz"
for letter1 in mystring:
for letter2 in mystring[mystring.index(letter1):]:
for letter3 in mystring[mystring.index(letter2):]:
for letter4 in mystring[mystring.index(letter3):]:
for letter5 in mystring[mystring.index(letter4):]:
for letter6 in mystring[mystring.index(letter5):]:
for letter7 in mystring[mystring.index(letter6):]:
for letter8 in mystring[mystring.index(leter7):]:
for letter9 in mystring[mystring.index(letter8):]:
for letter10 in mystring[mystring.index(letter9):]:
strr = "".join([letter3,letter7,letter2,letter1,letter4,letter5,letter6,letter10,letter8,letter9])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
</code></pre>
<p>这个循环严重减少了迭代次数,因为搜索的字符更少。它的外循环搜索的字符数少于它的每个循环。注意每个循环在同一个方向上搜索时,它是如何组织起来的。在</p>
<p>但它也是非常慢的,因为<code>mystring.index()</code>是一个缓慢的操作。我们可以通过不使用<code>mystring.index()</code>来加快速度。。。在</p>
^{pr2}$
<p>不过,这仍然是非常慢的,因为它有大量的迭代。在</p>
<p>这里的诀窍是itertools。。。在</p>
<pre><code>mystring = "abcdefghijklmnopqrstuvwxyz"
import itertools
for L1, L2, L3, L4, L5, L6, L7, L8, L9, L10 in itertools.combinations_with_replacement(mystring, 10):
strr = "".join([L3, L7, L2, L1, L4, L5, L6, L10, L8, L9])
if hashlib.md5(strr).hexdigest() == 'a50e38475041f76219748ee22c4377d4':
print ('key = {}'.format(strr))
break
</code></pre>
<p><code>itertools.combinations_with_replacement()</code>是在python中处理这类嵌套循环的方法,其中A>;=B>;=C>;=&ct,而且速度相当快。这是最快的解决办法。在</p>