【问题标题】:Python - Loop stops running after a short whilePython - 循环在短时间内停止运行
【发布时间】:2018-06-22 08:04:52
【问题描述】:

所以我在这里生成随机的十六进制值,对它们进行散列并与预先给定的散列进行比较。该程序测试了大约 4 000 个哈希值,然后停止运行而没有出现错误。

这是代码的循环部分:

def loop():

    randomhex = binascii.b2a_hex(os.urandom(4))
    hash_object = hashlib.sha1(randomhex)
    hashh = hash_object.hexdigest()
    print(hashh)

    if hashh == sha:
        done()
    else:
        loop()

【问题讨论】:

  • 你意识到你正在递归调用你的 loop() 函数吗?今晚有什么循环?
  • 这似乎是递归深度问题,使用sys.setrecursionlimit 或迭代解决问题。

标签: python loops hash


【解决方案1】:

你不能对这样的循环使用递归

这是您的调用树的小视图:

loop()
  loop()
    loop()
      loop()
        loop()
          loop()
             ...

以此类推,直到堆栈耗尽...

  • 你不需要递归,你根本没有使用以前的结果,你不需要回溯,你没有基本情况......
  • 如果幸运的话它可以工作,但大多数时候在经过大量迭代/递归调用后,当一个简单的@ 987654322@循环就够了。

我个人更喜欢带有手动breakwhile True 循环,这样可以省去在循环之前初始化变量的麻烦,如下所示:

def loop():

  while True:
    randomhex = binascii.b2a_hex(os.urandom(4))
    hash_object = hashlib.sha1(randomhex)
    hashh = hash_object.hexdigest()
    print(hashh)

    if hashh == sha:
        # we found the result: exit the loop
        break

附带说明一下,同时使用暴力破解 并不是破坏哈希的一种非常有效的方法...即使使用 os.urandom 一个简单的循环重复的可能性非常小从 1 到 2**31 的计算速度会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-11-26
    • 2018-10-14
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多