woshizhangpengp 发表于 2023-7-13 16:57:17

bytes函数,hash函数

请问各位大佬bytes这个函数作用是啥,utf-8是什么,hashlib.md5是hash函数的一种特殊用法嘛

陶远航 发表于 2023-7-13 17:01:01

bytes函数是Python中用来创建字节对象的函数,它可以接受一个字符串或一个整数序列作为参数,返回一个不可变的字节对象。例如:

>>> bytes('hello', 'utf-8')
b'hello'
>>> bytes()
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编码。

希望这些信息对你有帮助。如果你还有其他问题,欢迎继续提问。

sfqxx 发表于 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 = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each, each.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 = 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 = passwd

print("===========================")
print("目前已注册的用户有:")
for each in fc_db.items():
    print(each, each.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 = passwd`将用户名和密码的MD5哈希值对应关系存储在字典`fc_db`中。

至此,修正后的代码实现了输入用户名和密码,并将它们的对应关系以MD5哈希值的形式存储在字典中的功能。

totoro12366 发表于 2023-7-15 10:33:03

{:10_256:}大佬,好厉害
页: [1]
查看完整版本: bytes函数,hash函数