hgh456hgh 发表于 2022-5-11 15:19:53

38课 动手题 关于hashlib模块下 .digest()和.hexdigest()方法的问题

问题是1、.digest()和.hexdigest() 分别输出的是什么?
2.IDLE 版本Python 3.7.9 下运行:
<
import hashlib
coda_md5 = hashlib.md5() #这里创建一个以md5格式编译的函数
user_dict = {}
name = input('请输入用户名:')
while True:
    if name not in user_dict:
      code = input('请输入密码:')
      coda_md5.update(code.encode())
      #code类型为字符串,encode()函数是将字符串已二进制模式读取
      #.update()括号内容必须转码为二进制读取 例 字符串'2222' 需转码为b'2222'
      user_dict.update({name:coda_md5.hexdigest()})
      #.hexdigest()将md5二进制码转换回十六进制整形
      y_or_n = input('是否继续输入(Y/N):')
      if y_or_n == 'Y':
            name = input('请输入用户名:')
            continue
      else:
            break
    else:
      print('该用户名已被注册!')
      y_or_n = input('是否重新输入(Y/N):')
      if y_or_n == 'Y':
            name = input('请重新输入用户名:')
            continue
      else:
            break
print('''-------------------
目前已注册的用户有:''')
for i,j in user_dict.items():
    print(i + ':' + j))
>
运行结果报错如下:
请输入用户名:鱼小二
请输入密码:222222
-------------------
目前已注册的用户有:
Traceback (most recent call last):
File "D:/Program Files (x86)/38课 网站用户密码MD5存储.py", line 18, in <module>
    print(i + ':' + j)
TypeError: can only concatenate str (not "int") to str

为什么该处的变量j 是整形了?

Twilight6 发表于 2022-5-11 15:19:54


digest() 返回的是二进制数

hexdigest() 返回的是 十六进制数

你对其进行拼接操作 Python 不懂你是想使用 加法 还是使用 字符串拼接而报错

将最后输出的 j 转换为字符串进行拼接即可输出,参考代码:
import hashlib
coda_md5 = hashlib.md5() #这里创建一个以md5格式编译的函数
user_dict = {}
name = input('请输入用户名:')
while True:
    if name not in user_dict:
      code = input('请输入密码:')
      coda_md5.update(code.encode())

      # code类型为字符串,encode()函数是将字符串已二进制模式读取
      # .update()括号内容必须转码为二进制读取 例 字符串'2222' 需转码为b'2222'
      user_dict.update({name:coda_md5.hexdigest()})
      #.hexdigest()将md5二进制码转换回十六进制整形
      y_or_n = input('是否继续输入(Y/N):')
      if y_or_n == 'Y':
            name = input('请输入用户名:')
            continue
      else:
            break
    else:
      print('该用户名已被注册!')
      y_or_n = input('是否重新输入(Y/N):')
      if y_or_n == 'Y':
            name = input('请重新输入用户名:')
            continue
      else:
            break
print('''-------------------
目前已注册的用户有:''')
for i,j in user_dict.items():
    print(i + ':' + str(j))                              # ------------------- 将此处 j 十六进制数转换为字符串即可

hgh456hgh 发表于 2022-5-12 10:39:22

Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import hashlib
>>> coda_md5 = hashlib.md5()
>>> type(coda_md5)
<class '_hashlib.HASH'>
>>> coda_md5.update(b'22222')
>>> coda_md5.hexdigest()
'3d2172418ce305c7d16d4b05597c6a59'
>>> type(coda_md5.hexdigest())
<class 'str'>
第二个问题是这样的看上面type(coda_md5.hexdigest()) 是'str'为什么 最后那个for循环的变量J变成了int?
页: [1]
查看完整版本: 38课 动手题 关于hashlib模块下 .digest()和.hexdigest()方法的问题