哈希吧,滚雪球学 Python 哈希表与可哈希对象

网友投稿 806 2022-05-30

橡皮擦,一个逗趣的互联网高级网虫,新的系列,让我们一起 Be More Pythonic。

滚雪球学 Python 第二轮

已完成的文章清单

十一、Python 哈希表与可哈希对象

11.1 哈希表(散列表)

11.2 可哈希与不可哈希

11.3 Python hash() 函数

11.4 hashlib 模块

11.5 这篇博客的总结

已完成的文章清单

滚雪球学 Python 第二轮开启,进阶之路,列表与元组那些事儿

说完列表说字典,说完字典说集合,滚雪球学 Python

关于 Python 中的字符串,我在补充两点,滚雪球学 Python

列表推导式与字典推导式,滚雪球学 Python

滚雪球学 Python 之 lambda 表达式

滚雪球学 Python 之内置函数:filter、map、reduce、zip、enumerate

Python 中级知识之装饰器,滚雪球学 Python

滚雪球学 Python 之闭包操作,本系列第 8 篇文章

滚雪球学 Python 之怎么玩转时间和日期库

滚雪球学 Python 之作用域下的 global 和 nonlocal 关键字

十一、Python 哈希表与可哈希对象

11.1 哈希表(散列表)

哈希是从 Hash 音译过来的,哈希表(hashtable),也叫做散列表。

哈希表是键值对的无序集合,其每个键都是唯一的,核心算法是通过索引去查找值,Python 中的字典符合哈希表结构,字典中每个键对应一个值,my_dict={"key1":"value1","key2":"value2"}。

哈希是使用算法将任意大小的数据映射到固定长度输出的过程,该输出就是哈希值。

哈希算法可以创建高性能的数据结构,该结构可以快速存储和访问大量数据,哈希值通过哈希函数计算。

哈希函数,本质上是键到值的映射关系;

哈希表本质上就是一个数组,存储的是经过哈希函数运算之后得到的值;

哈希值是唯一标识数据的固定长度的数值。

这些都属于概念层面的知识,初期了解即可,后面随着应用会逐步掌握。

11.2 可哈希与不可哈希

这部分在 官方文档 说的比较绕,简单说一下的结论(也是大家共识的),一个对象(Python 中万物皆对象)在生命周期内,保持不变,就是可哈希的(hashable)。

还有一个更简单的证明办法,在 Python 中能插入 set 集合的元素是可哈希的,例如下述代码:

my_set = set() test = [1, 3.14, 'hello', (2, 3), {'key': 1}, [1, 2], {3,6}] my_set.add(test[0]) my_set.add(test[1]) my_set.add(test[2]) my_set.add(test[3]) # my_set.add(test[4]) # my_set.add(test[5]) # my_set.add(test[6])

1

2

3

4

5

6

7

8

9

10

测试之后得到的结论是:

可以被哈希的数据结构:int、float、str、tuple;

不可以被哈希的数据结构:dict、list、set。

加上之前滚雪球学到的知识,可以了解到,可以被哈希的数据类型都是不可变的,而不可以被哈希的数据类型是可变的,有点绕,稍微停顿一下,多读两遍即可。

可哈希的对象通常用作字典的键和集合的成员,因为这些数据结构在内部使用哈希值。

最终结论: 可哈希 ≈ 不可变。

11.3 Python hash() 函数

hash 函数用于获取一个对象的哈希值,语法结果为 hash(object),返回值是对象的哈希值, 哈希值是整数。

使用方式非常简单:

print(hash('test')) print(hash(1)) # 注意下面使用不可哈希对象会出现错误 # hash([1,2,3])

1

2

3

4

11.4 hashlib 模块

hashlib 提供了常见的摘要算法,具体如下:

md5()、sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()、blake2s()、sha3_224()、sha3_256()、sha3_384()、 sha3_512()、 shake_128()、shake_256()

使用 dir(hashlib) 即可获取上述所有可用方法。

MD5 是最常见的摘要算法,生成结果是固定的 16 字节,通常用一个 32 位的 16 进制字符串表示,示例代码如下:

import hashlib # MD5算法 md5 = hashlib.md5() data = "hello world" md5.update(data.encode('utf-8')) # 计算 hash 值,拿到加密字符串 print(md5.hexdigest())

1

2

3

4

5

6

7

SHA1 算法更安全,它的结果是 20 字节长度,通常用一个 40 位的 16 进制字符串表示。而比 SHA1 更安全的算法是 SHA256 和 SHA512 等,不过越安全的算法越慢,并且摘要长度更长。

哈希吧,滚雪球学 Python 哈希表与可哈希对象

11.5 这篇博客的总结

本篇博客为大家说明了 Python 的哈希表概念和可哈希对象,对于初学阶段是有帮助的。

深入研究下去,你应该尝试自己手写哈希算法与可哈希对象,再学习一段时间吧,希望本文对你有所帮助。

相关阅读

Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧

Python 爬虫小课,精彩 9 讲

今天是持续写作的第

108

/ 200 天。

如果你想跟博主建立亲密关系,可以关注同名公众号

梦想橡皮擦

,近距离接触一个逗趣的互联网高级网虫。

博主 ID:梦想橡皮擦,希望大家

评论

Python 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《软件项目管理(第二版)》第 3 章——项目计划 重点部分总结
下一篇:※【python自学】7个Python生态系统核心库,你值得拥有
相关文章