散列值的多次迭代

时间:2018-05-31 14:21:20

标签: python

我正在尝试编写一个函数来计算特定值的多个迭代哈希值(并在此期间输出每次迭代)。

但是,我无法理解如何多次执行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()
.......

3 个答案:

答案 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