我正在尝试编写一个函数来计算特定值的多个迭代哈希值(并在此期间输出每次迭代)。
但是,我无法理解如何多次执行md5哈希函数。例如:
...--o--o--A-- D --
\ \
\ F <-- master ,origin/master (updated) (my merge commit for non fast forward)
\ /
C--B
我认为递归是解决方案,但我似乎无法正确实现它。这是一般的阶乘递归示例,但我如何使其适应哈希:
a = hashlib.md5('fun').hexdigest()
b = hashlib.md5(a).hexdigest()
c = hashlib.md5(b).hexdigest()
d = hashlib.md5(c).hexdigest()
.......
答案 0 :(得分:4)
这是发电机的经典应用。由于异常繁重的堆栈,Python最多允许500次递归。对于可能在那么多次附近执行的任何事情,迭代通常会更快。使用生成器可以在执行任意数量的执行后中断,并允许在代码中平放使用所需的逻辑。以下示例打印10个此类执行的输出。
from itertools import islice
def hashes(n):
while True:
n = hashlib.md5(n).hexdigest()
yield n
for h in islice(hashes('fun'), 10):
print(h)
答案 1 :(得分:1)
一般来说,你正在寻找像
这样的循环while True:
x = f(x)
您使用最新应用程序的结果重复替换输入。
对于您的具体示例,
def iterated_hash(x):
while True:
x = hashlib.md5(x).hexdigest()
return x
但是,由于你真的不想这么做很多次,你需要提供一个计数:
def iterated_hash(x, n):
while True:
if n == 0:
return x
x = hashlib.md5(x).hexdigest()
或使用for
循环,
def iterated_hash(x, n):
for _ in range(n):
x = hashlib.md5(x).hexdigest()
return x
(实际上,你想使用for
循环,但很高兴看到for
循环只是一般无限循环的有限特殊情况。)
答案 2 :(得分:0)
根据需要迭代多次:
def make_hash(text, iterations):
a = hashlib.md5(text).hexdigest()
for _ in range(iterations):
a = hashlib.md5(a).hexdigest()
return a
a = make_hash('fun', 5) # 5 iterations