目录
1、应用场景
hashlib
库在Python中常用于数据加密和数据完整性校验。以下是一些具体的应用场景:
- 密码存储:为了安全起见,系统通常不会直接存储用户的明文密码,而是存储其哈希值。当用户输入密码进行验证时,系统会将输入的密码进行哈希处理,然后与存储的哈希值对比。
- 文件校验:哈希函数可以生成文件的唯一哈希值,通过比较文件的哈希值,可以快速检查文件是否被篡改。
- 数据去重:在处理大量数据时,可以使用哈希函数对数据进行处理,生成的哈希值相同的数据可以被视为重复数据,从而实现数据去重。
- 数据检索:哈希表是一种常用的数据结构,它通过哈希函数将键映射到表的一个位置以加快查找速度。
- 数字签名:在信息安全领域,哈希函数也被用于生成数字签名,以验证数据的完整性和真实性。
- 区块链技术:在区块链技术中,哈希函数被用于生成每个区块的哈希值,用于确保区块链的安全和一致性。
2、hashlib-标准库
hashlib是Python的标准库,它提供了一系列的算法,如MD5,SHA1,SHA224,SHA256,SHA384,SHA512等,用于在Python中生成散列值。
Python的hashlib
库提供了一系列的散列函数。以下是该库的一些主要方法:
hashlib.new(name, data=None)
: 这个方法用于创建一个新的hash对象。hashlib.md5(data=None)
: 创建一个新的md5 hash对象。hashlib.sha1(data=None)
: 创建一个新的sha1 hash对象。hashlib.sha224(data=None)
: 创建一个新的sha224 hash对象。hashlib.sha256(data=None)
: 创建一个新的sha256 hash对象。hashlib.sha384(data=None)
: 创建一个新的sha384 hash对象。hashlib.sha512(data=None)
: 创建一个新的sha512 hash对象。hashlib.sha3_224(data=None)
: 创建一个新的sha3_224 hash对象。hashlib.sha3_256(data=None)
: 创建一个新的sha3_256 hash对象。hashlib.sha3_384(data=None)
: 创建一个新的sha3_384 hash对象。hashlib.sha3_512(data=None)
: 创建一个新的sha3_512 hash对象。
以上每个方法都可以接收一个可选的字节数据,并返回一个相应的hash对象。这些对象有如下方法:
update(data)
: 更新hash对象的散列值。digest()
: 返回散列结果的字节表示。hexdigest()
: 返回散列结果的十六进制字符串表示。copy()
: 返回当前hash对象的一个复制,可以用于更新hash值的计算。
以上就是hashlib
库的主要方法。
以下是一些使用Python hashlib
库的示例:
- 使用
md5
散列:
import hashlib
m = hashlib.md5()
m.update(b"Hello, world!")
print(m.hexdigest())
- 使用
sha256
散列:
import hashlib
s = hashlib.sha256()
s.update(b"Hello, world!")
print(s.hexdigest())
- 使用
update
方法进行多次更新:
import hashlib
m = hashlib.md5()
m.update(b"Hello, ")
m.update(b"world!")
print(m.hexdigest())
- 使用
digest
方法获取字节表示:
import hashlib
m = hashlib.md5()
m.update(b"Hello, world!")
print(m.digest())
- 使用
copy
方法复制hash对象:
import hashlib
m = hashlib.md5()
m.update(b"Hello, ")
n = m.copy()
m.update(b"world!")
n.update(b"AI!")
print("m: ", m.hexdigest())
print("n: ", n.hexdigest())
以上就是一些使用Python hashlib
库的示例。
在Python的hashlib
库中,m.update(b"hello")
是用来更新hash对象m
的散列值的。
这里的b"hello"
是一个字节字符串。在Python中,字符串前面的b
表示该字符串是字节类型的。字节字符串在很多处理二进制数据和与C语言库交互的场景中是必需的。
update
方法接收一个字节字符串参数,并用它来更新hash对象的当前散列值。这个方法可以被多次调用以连续更新散列值。
例如:
import hashlib
m = hashlib.md5() # 创建一个md5 hash对象
m.update(b"Hello, ") # 更新散列值
m.update(b"world!") # 再次更新散列值
print(m.hexdigest()) # 打印最终的散列值
在这个例子中,m.update(b"Hello, ")
和m.update(b"world!")
连续更新了m
的散列值,最后的散列值是基于整个输入字符串"Hello, world!"
计算的。
m.update(b"hello")
方法在hashlib
库中是用于更新散列值的,而不是覆盖。当你多次调用update
方法时,它会将每次传入的数据视为连续的输入流,并基于所有输入数据计算散列值。
例如:
import hashlib
m = hashlib.md5()
m.update(b"Hello, ")
m.update(b"world!")
print(m.hexdigest())
在这个例子中,m.update(b"Hello, ")
和m.update(b"world!")
连续更新了m
的散列值,最后的散列值是基于整个输入字符串"Hello, world!"
计算的,而不仅仅是最后一次调用update
方法时的输入"world!"
。所以,update
方法是在原有的基础上进行更新,而不是覆盖。
m.update(data.encode(encoding='utf-8'))
`m.update(data.encode(encoding='utf-8'))` 是 Python 中用于更新哈希对象的一种方法。这行代码的功能是将字符串 `data` 编码为 UTF-8 格式后,用这个编码后的数据更新哈希对象 `m`。
具体来说,`update()` 方法是哈希对象(例如 hashlib 中的 md5 或者 sha1 对象)的一个方法,用于向哈希对象添加新的数据。当所有数据都被添加后,可以使用 `digest()` 或 `hexdigest()` 方法来获取哈希值。
`encode(encoding='utf-8')` 是将 `data` 字符串转化为字节串(bytes)的方法,其中 'utf-8' 是一种常用的字符编码方式。在哈希计算中,通常要求输入的数据为字节串,所以需要先进行编码转化。
所以整个表达式的含义是:将 `data` 字符串转化为 UTF-8 编码的字节串,然后用这个字节串更新 `m` 哈希对象的哈希值。
UTF-8 编码是一种变长的编码方式,用于将 Unicode 字符串转换为字节流。在 UTF-8 编码中,每个字符可以由 1 到 4 个字节表示。ASCII 字符(0-127)只需要一个字节,拉丁文和其他常见字符可能需要两个字节,而更复杂的字符(例如许多东亚字符)可能需要三到四个字节。这种编码方式的优势在于它的兼容性,因为它可以处理各种字符集,并且与 ASCII 编码兼容。
Unicode(统一码、万国码)是一种计算机编码标准,其设计目标是用来处理世界上所有的字符,使得计算机可以用更为简单的方式来呈现和使用各种语言。
Unicode 是一个字符集,它用唯一的数字表示每一个字符,无论这个字符在什么平台、设备、应用或者语言中。这个数字被称为 Unicode 码点或者 Unicode 编码点,例如,英文的字母 A 的 Unicode 码点是 U+0041。
Unicode 字符串则是由 Unicode 编码的字符组成的字符串。在各种编程语言中,通常有专门的数据类型或编码方式来处理 Unicode 字符串。例如在 Python 中,可以直接在字符串前添加 'u' 或 'U' 来创建 Unicode 字符串,如 u"hello"。
UTF-8是一种针对Unicode的可变长度字符编码,由Ken Thompson和Rob Pike于1992年创建。UTF-8使用1到4个字节来表示字符,能够用于表示Unicode标准中的任何字符。
UTF-8的编码规则如下:
- 对于单字节的字符,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的字符(n > 1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个字符的Unicode码。
这样,UTF-8编码既可以处理单字节字符,又可以处理多字节字符,兼容性非常好。