首页 > 解决方案 > 如果在函数返回的哈希值中找到子字符串,则 for 循环中的 if 语句停止迭代

问题描述

为了教学目的,我有以下代码正在寻求执行以下操作:

  1. 函数哈希,接受字符串(比如说“比特币”)并返回一个哈希值。
  2. for 循环从 0 迭代到一个范围并不断添加“!” 到字符串“比特币”,例如在迭代 1 = 比特币,迭代 2 = 比特币!,迭代 3 = 比特币!!,迭代 4 = 比特币!!!,等等。
  3. 在每种情况下,都会为字符串找到哈希值(在每次迭代中,由于连接的“!”字符而生成不同的哈希值。
  4. 我在 for 循环中添加了一个 if 函数,如果值以“00”开头,该函数应该停止并打印散列值。

没有。4 我的代码中断。我尝试了各种方法,但认为我缺少一些非常基本的东西。

测试数据:请使用:“比特币”

预期结果:如果函数 hash 返回的哈希值中有两个前导零,例如以 00 开头,则 for 循环应该停止,它应该打印出 for 循环中的数字 (i) 和实际的哈希值.

import hashlib

def hash(mystring):
    hash_object=hashlib.md5(mystring.encode())
    print(hash_object.hexdigest())


mystring=input("Enter your transaction details (to hash:")


for i in range(100000000000):
    hash(mystring)
    mystring=mystring+"!"
    if "00" in hash(mystring):
        break
    print(hash(mystring))

hash(mystring)

我输入“比特币”得到的错误是:

Enter your transaction details (to hash:bitcoin
cd5b1e4947e304476c788cd474fb579a
520e54321f2e9de59aeb0e7ba69a628c
Traceback (most recent call last):
  File "C:/Users/testa/Desktop/bitcoin_mine_pythonexample.py", line 14, in <module>
    if "00" in hash(mystring):
TypeError: argument of type 'NoneType' is not iterable
>>> 

我也试过这个 - 尝试添加一个返回语句并使用稍微不同的方法 - 这是正确的路线吗?

import hashlib

def hash(mystring):
    hash_object=hashlib.md5(mystring.encode())
    print(hash_object.hexdigest())
    if "00" in hash_object:
                return 1
        else:
                return 0

mystring=input("Enter your transaction details (to hash:")


for i in range(100):
    hash(mystring)
    mystring=mystring+"!"
    if hash(mystring)==1":
            print("Found")

hash(mystring)

标签: pythonfunctionfor-loophashmd5

解决方案


几件事。首先,hash没有返回任何东西,它只是打印结果然后返回None。通过删除print并返回哈希值来更改它。

其次,使用" 在字符串中的任何位置"00" in string查找"00,而不仅仅是开始。此外,hash每次迭代主循环调用 3 次。还有一个hash对循环外部的最终调用,它没有任何作用。

以下应该做你想要的:

def myhash(mystring):
    hash_object=hashlib.md5(mystring.encode())
    return hash_object.hexdigest()

mystring=input("Enter your transaction details (to hash:")

while True:
    hashval = myhash(mystring)
    print(hashval)
    if hashval.startswith("00"):
        break
    mystring += "!"

更新:我重命名hashmyhash避免覆盖hashPython 中的内置函数。


推荐阅读