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 是整形了?
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 十六进制数转换为字符串即可 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]