【问题标题】:python3 recursive function of n * (b(a))n * (b(a))的python3递归函数
【发布时间】:2018-06-20 10:16:39
【问题描述】:

我正在尝试编写一个函数,该函数将递归地散列一个键 n 次,在 sha224 和 sha256 之间交替。每次迭代都是 hash_256(hash_224)——一个 hash256 对应于 key 的 hash224——所以它会产生 n * (hash_256(hash_224))。但是,我是编码新手,不知道如何使用这些参数编写递归函数。

import hashlib

def shasum(key, n):
key = str(key).encode('utf-8')

hash_a = hashlib.sha224(key).hexdigest().encode('utf-8'))
hash_b = hashlib.sha256(hash_a).hexdigest()

if n == 0 or 1:
return hash_b #one iteration of 256(224)
else:
return n-1
return hash_b #stuck here

已编辑:现在它的行为类似于数字生成器。怎么了?

import hashlib

 n = 0

def sha480(seed):
hashed_224 = str(hashlib.sha224(seed)).encode('utf-8')
hashed_256 = hashlib.sha256(hashed_224).hexdigest()
hashed_480 = str(hashed_256)
print("hash: " + hashed_480)

def repeater(key, n):
if n == 0:
 return key
 seed = str(key).encode('utf-8')
while n > 0:
return sha480(repeater(seed, n-1))

repeater('what', 2)

【问题讨论】:

  • 缩进在 Python 中很重要。请正确缩进您的代码。
  • if n == 0 or 1 始终为真。

标签: python python-3.x python-2.7 loops recursion


【解决方案1】:

您根本没有递归调用。您可以将其更改为:

def hash_a(key):
    return hashlib.sha224(key).hexdigest().encode('utf-8')

def hash_b(key):
    return hashlib.sha256(key).hexdigest()

def shasum(key, n):
    if n == 0:  # base case: 0 iterations -> return key itself
        return key
    key = str(key).encode('utf-8')
    return hash_b(hash_a(shasum(key, n - 1)))  # recursve call

附注:n == 0 or 1 等同于 (n == 0) or 1,这始终是正确的。对于该模式,请使用 n == 0 or n == 1 或更短的 n in (0, 1)

【讨论】:

  • 你知道“unicode-objects must be encoding before hashing”是什么意思吗?
  • 谢谢,这是我认为我缺少的部分:return hash_b(hash_a(shasum(key, n - 1)))
【解决方案2】:

您的代码几乎是正确的。只是修复了一些小问题,如下所示

import hashlib

def shasum(key, n):
    print ("n: " + str(n))
    key = str(key).encode('utf-8')

    hash_a = hashlib.sha224(key).hexdigest().encode('utf-8')
    print ("hash_a: " + str(hash_a))
    hash_b = hashlib.sha256(hash_a).hexdigest()
    print ("hash_b: " + str(hash_b))
    if n == 0:
        return hash_b #one iteration of 256(224)
    else:
        return shasum(hash_b, n-1)

【讨论】:

  • 如果 n>0,结果总是返回 hash_b。在提出进一步问题之前,我会尝试解决它!
  • 是的。您可以根据需要进行更改。
  • 我尝试了递归方法,现在它的功能就像一个数字生成器。怎么了?
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多