鱼C论坛

 找回密码
 立即注册
查看: 871|回复: 3

[已解决]bytes函数,hash函数

[复制链接]
发表于 2023-7-13 16:57:17 | 显示全部楼层 |阅读模式

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

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

x
请问各位大佬bytes这个函数作用是啥,utf-8是什么,hashlib.md5是hash函数的一种特殊用法嘛
最佳答案
2023-7-13 17:03:04
这段代码有一些错误,我将为您进行修正并解释其中的相关函数和概念。

首先,让我们来逐行分析代码:
import hashlib

fc_db = {"小甲鱼": hashlib.md5(b"I love FishC"), "不二如是": hashlib.md5(b"FishC5201314")}
name = input("请输入用户名:")
while True:
    if fc_db.get(name) != None:
        print("该用户已被注册!")
        name = input("请重新输入用户名:")
    else:
        break

passwd = input("请输入密码:")
bstr = bytes(passwd, "utf-8")
passwd = hashlib.md5(bstr)
fc_db[name] = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each[0], each[1].hexdigest(), sep=":")

现在让我们对代码逐行进行解释:

- `import hashlib`:导入Python标准库中的`hashlib`模块,它提供了多种常见的哈希算法函数。
- `hashlib.md5`:代表MD5哈希算法的实现。MD5是一种常见的哈希函数,它将任意长度的数据映射到一个固定长度(通常为128位)的哈希值。在本代码中,`hashlib.md5`函数被用于计算密码的哈希值。
- `fc_db`:是一个字典类型的变量,用于存储已注册用户的用户名和相应密码的MD5哈希值。用户名作为键,MD5哈希值作为值。
- `input("请输入用户名:")`:提示用户输入用户名,并将其保存在变量`name`中。
- `while True:`:无限循环,直到找到一个尚未注册的用户名才会退出循环。
- `if fc_db.get(name) != None:`:检查字典`fc_db`中是否存在键为`name`的项,如果存在则输出提示信息,要求重新输入用户名。如果存在键为`name`的项,说明该用户名已经被注册过了,程序会输出"该用户已被注册!"的提示信息,并要求重新输入用户名。
- `else:`:如果不存在键为`name`的项,说明该用户名尚未被注册,循环将会被打破。
- `passwd = input("请输入密码:")`:提示用户输入密码,并将其保存在变量`passwd`中。
- `bstr = bytes(passwd, "utf-8")`:使用UTF-8编码将密码转换为字节串,并将其保存在变量`bstr`中。UTF-8是一种常用的字符编码方案,它可以将Unicode字符映射为字节序列。
- `passwd = hashlib.md5(bstr)`:使用MD5算法对密码的字节串进行哈希计算,并将计算结果赋值给`passwd`变量。这里应该是想将用户输入的密码进行哈希处理后再存储。
- `fc_db[name] = passwd`:将用户名`name`作为键,密码的MD5哈希值`passwd`作为值,添加到`fc_db`字典中。实际上,此行代码应该放在`break`之前才能确保将用户的密码正确保存到字典中。

下面是修正后的代码:
import hashlib

fc_db = {}
name = input("请输入用户名:")
while True:
    if fc_db.get(name) is not None:
        print("该用户已被注册!")
        name = input("请重新输入用户名:")
    else:
        break

passwd = input("请输入密码:")
bstr = bytes(passwd, "utf-8")
passwd = hashlib.md5(bstr)
fc_db[name] = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each[0], each[1].hexdigest(), sep=":")

修正后的代码将能够正确地将用户的用户名和密码MD5哈希值保存到字典中,并输出注册过的- 用户名和密码的对应关系。现在让我们来解释一下修正后的代码中的相关函数和概念。

首先,`import hashlib`语句导入了Python标准库中的`hashlib`模块,它提供了多种常见的哈希算法函数。

接下来,`fc_db`是一个空字典,用于存储已注册用户的信息。键为用户名,值为密码的MD5哈希值。可以通过字典的`get()`方法来获取字典中键对应的值,并判断是否为`None`来确定是否已经注册过该用户。

`input("请输入用户名:")`会提示用户输入用户名,并将输入的值保存在变量`name`中。随后的`while True:`创建了一个无限循环,直到输入一个尚未被注册的用户名才会退出循环。

在循环体中,使用`fc_db.get(name)`检查字典`fc_db`中是否存在键为`name`的项。如果存在,即表示用户名已经被注册,会输出"该用户已被注册!"的提示信息,并要求用户重新输入用户名。否则,即用户名尚未被注册,跳出循环。

接下来,`passwd = input("请输入密码:")`提示用户输入密码,并将输入的字符串保存在变量`passwd`中。

然后,使用`bytes(passwd, "utf-8")`将密码转换为UTF-8编码的字节串,并将其保存在变量`bstr`中。这里使用UTF-8编码是为了将密码转换为字节序列,以便进行哈希计算。

接着,`passwd = hashlib.md5(bstr)`对密码的字节串进行MD5哈希计算,并将计算结果赋值给`passwd`变量。这里使用的是`hashlib.md5`函数,它返回一个具有MD5哈希功能的对象。然后通过调用该对象的`hexdigest()`方法,可以获取十六进制表示的MD5哈希值,并将其保存在变量`passwd`中。

最后,通过`fc_db[name] = passwd`将用户名和密码的MD5哈希值对应关系存储在字典`fc_db`中。

至此,修正后的代码实现了输入用户名和密码,并将它们的对应关系以MD5哈希值的形式存储在字典中的功能。
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-13 17:01:01 | 显示全部楼层
bytes函数是Python中用来创建字节对象的函数,它可以接受一个字符串或一个整数序列作为参数,返回一个不可变的字节对象。例如:
>>> bytes('hello', 'utf-8')
b'hello'
>>> bytes([97, 98, 99])
b'abc'

utf-8是一种编码方式,它可以将Unicode字符转换为字节序列,也可以将字节序列转换为Unicode字符。utf-8是一种变长的编码方式,它可以用1到4个字节来表示一个字符,根据字符的不同而变化。例如:
>>> '你好'.encode('utf-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')
'你好'

hashlib.md5是Python中用来计算MD5摘要(哈希值)的函数,它可以接受一个字节对象作为参数,返回一个MD5对象。MD5是一种哈希算法,它可以将任意长度的数据映射为一个固定长度(128位)的数据,具有不可逆和唯一性的特点。例如:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'hello')
>>> m.hexdigest()
'5d41402abc4b2a76b9719d911017c592'
注意,hashlib.md5函数只能接受字节对象作为参数,如果你要传入一个字符串,你需要先将其编码为字节对象,例如使用utf-8编码。

希望这些信息对你有帮助。如果你还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-13 17:03:04 | 显示全部楼层    本楼为最佳答案   
这段代码有一些错误,我将为您进行修正并解释其中的相关函数和概念。

首先,让我们来逐行分析代码:
import hashlib

fc_db = {"小甲鱼": hashlib.md5(b"I love FishC"), "不二如是": hashlib.md5(b"FishC5201314")}
name = input("请输入用户名:")
while True:
    if fc_db.get(name) != None:
        print("该用户已被注册!")
        name = input("请重新输入用户名:")
    else:
        break

passwd = input("请输入密码:")
bstr = bytes(passwd, "utf-8")
passwd = hashlib.md5(bstr)
fc_db[name] = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each[0], each[1].hexdigest(), sep=":")

现在让我们对代码逐行进行解释:

- `import hashlib`:导入Python标准库中的`hashlib`模块,它提供了多种常见的哈希算法函数。
- `hashlib.md5`:代表MD5哈希算法的实现。MD5是一种常见的哈希函数,它将任意长度的数据映射到一个固定长度(通常为128位)的哈希值。在本代码中,`hashlib.md5`函数被用于计算密码的哈希值。
- `fc_db`:是一个字典类型的变量,用于存储已注册用户的用户名和相应密码的MD5哈希值。用户名作为键,MD5哈希值作为值。
- `input("请输入用户名:")`:提示用户输入用户名,并将其保存在变量`name`中。
- `while True:`:无限循环,直到找到一个尚未注册的用户名才会退出循环。
- `if fc_db.get(name) != None:`:检查字典`fc_db`中是否存在键为`name`的项,如果存在则输出提示信息,要求重新输入用户名。如果存在键为`name`的项,说明该用户名已经被注册过了,程序会输出"该用户已被注册!"的提示信息,并要求重新输入用户名。
- `else:`:如果不存在键为`name`的项,说明该用户名尚未被注册,循环将会被打破。
- `passwd = input("请输入密码:")`:提示用户输入密码,并将其保存在变量`passwd`中。
- `bstr = bytes(passwd, "utf-8")`:使用UTF-8编码将密码转换为字节串,并将其保存在变量`bstr`中。UTF-8是一种常用的字符编码方案,它可以将Unicode字符映射为字节序列。
- `passwd = hashlib.md5(bstr)`:使用MD5算法对密码的字节串进行哈希计算,并将计算结果赋值给`passwd`变量。这里应该是想将用户输入的密码进行哈希处理后再存储。
- `fc_db[name] = passwd`:将用户名`name`作为键,密码的MD5哈希值`passwd`作为值,添加到`fc_db`字典中。实际上,此行代码应该放在`break`之前才能确保将用户的密码正确保存到字典中。

下面是修正后的代码:
import hashlib

fc_db = {}
name = input("请输入用户名:")
while True:
    if fc_db.get(name) is not None:
        print("该用户已被注册!")
        name = input("请重新输入用户名:")
    else:
        break

passwd = input("请输入密码:")
bstr = bytes(passwd, "utf-8")
passwd = hashlib.md5(bstr)
fc_db[name] = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each[0], each[1].hexdigest(), sep=":")

修正后的代码将能够正确地将用户的用户名和密码MD5哈希值保存到字典中,并输出注册过的- 用户名和密码的对应关系。现在让我们来解释一下修正后的代码中的相关函数和概念。

首先,`import hashlib`语句导入了Python标准库中的`hashlib`模块,它提供了多种常见的哈希算法函数。

接下来,`fc_db`是一个空字典,用于存储已注册用户的信息。键为用户名,值为密码的MD5哈希值。可以通过字典的`get()`方法来获取字典中键对应的值,并判断是否为`None`来确定是否已经注册过该用户。

`input("请输入用户名:")`会提示用户输入用户名,并将输入的值保存在变量`name`中。随后的`while True:`创建了一个无限循环,直到输入一个尚未被注册的用户名才会退出循环。

在循环体中,使用`fc_db.get(name)`检查字典`fc_db`中是否存在键为`name`的项。如果存在,即表示用户名已经被注册,会输出"该用户已被注册!"的提示信息,并要求用户重新输入用户名。否则,即用户名尚未被注册,跳出循环。

接下来,`passwd = input("请输入密码:")`提示用户输入密码,并将输入的字符串保存在变量`passwd`中。

然后,使用`bytes(passwd, "utf-8")`将密码转换为UTF-8编码的字节串,并将其保存在变量`bstr`中。这里使用UTF-8编码是为了将密码转换为字节序列,以便进行哈希计算。

接着,`passwd = hashlib.md5(bstr)`对密码的字节串进行MD5哈希计算,并将计算结果赋值给`passwd`变量。这里使用的是`hashlib.md5`函数,它返回一个具有MD5哈希功能的对象。然后通过调用该对象的`hexdigest()`方法,可以获取十六进制表示的MD5哈希值,并将其保存在变量`passwd`中。

最后,通过`fc_db[name] = passwd`将用户名和密码的MD5哈希值对应关系存储在字典`fc_db`中。

至此,修正后的代码实现了输入用户名和密码,并将它们的对应关系以MD5哈希值的形式存储在字典中的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-15 10:33:03 | 显示全部楼层
大佬,好厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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