鱼C论坛

 找回密码
 立即注册
查看: 1622|回复: 2

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

[复制链接]
发表于 2022-5-11 15:19:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题是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 是整形了?
最佳答案
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 十六进制数转换为字符串即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 十六进制数转换为字符串即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-12 10:39:22 | 显示全部楼层
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] 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?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 08:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表