在00.000000 和99.999999 之间生成所有可能的坐标非常简单:
from itertools import product
import hashlib
digits = '0123456789'
for combo in product(digits, repeat=16):
coords = '{}.{} {}.{}'.format(
''.join(combo[:2]), ''.join(combo[2:8]),
''.join(combo[8:10]), ''.join(combo[10:]))
hash = hashlib.sha256(coords).hexdigest()
if hash == '3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e':
print coords
break
这将暴力破解所有 10**16(一个很大的数字)组合。坐下来放松一下,这需要一段时间。
而“一段时间”,我们真正的意思是不是在你的有生之年,也不是在任何其他人的。仅迭代product() 生成的所有可能组合需要大量时间,因为尝试添加的每个数字都会将所需时间增加 10 倍:
>>> from collections import deque
>>> from itertools import product
>>> from timeit import timeit
>>> digits = '0123456789'
>>> timeit(lambda: deque(product(digits, repeat=8), 0), number=5)
3.014396679995116
>>> timeit(lambda: deque(product(digits, repeat=9), 0), number=5)
30.99540744899423
如果生成 8 位数字的所有可能组合需要 0.8 秒(4 秒除以 5 次重复),9 位数字需要 8 秒,那么您可以推断 10 位数字几乎需要 1.5 分钟,等等。只需生成所有可能的组合16 位数字需要 100 万 (10 ** 6) 倍的时间,是 10 位数字的时间,因此循环运行需要 963 天或 3 年。您可以将此任务拆分为大量计算机上的 2000 个不同进程,这些计算机的内核总数足以并行运行这些进程,从而将时间缩短到 12 小时以下。
那么循环体本身每百万次迭代大约需要 2.4 秒:
>>> from random import choice
>>> combo = tuple(choice(digits) for _ in range(16)) # random combination for testing
>>> timeit("""\
... coords = '{}.{} {}.{}'.format(
... ''.join(combo[:2]), ''.join(combo[2:8]),
... ''.join(combo[8:10]), ''.join(combo[10:]))
... hash = hashlib.sha256(coords).hexdigest()
... if hash == '3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e': pass
... """, 'from __main__ import combo; import hashlib')
2.3429908752441406
但是你的工作量比这多 10 ** 10(10 亿)倍,总共大约 743 年的计算工作。即使能够运行 20,000 个并行进程也不会将其减少到一个合理的数字(这仍然是大约 13.5 年的工作)。
Python 的速度不足以完成这项任务。使用 GPU 应该可以达到500 million hashes per second (0.5 Gigahash / s),此时您可以运行上述蛮力操作并在大约 230 天内在这样的系统上找到解决方案。当然,这是有代价的,因为这样的钻机每月运行成本约为 3000 至 4000 美元!但如果有足够的专用硬件,您当然可以“破解”“人道”时间线中的哈希值。