哈希吧,滚雪球学 Python 哈希表与可哈希对象
橡皮擦,一个逗趣的互联网高级网虫,新的系列,让我们一起
Be More Pythonic
。
已完成的文章清单
滚雪球学 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
集合的元素是可哈希的,例如下述代码:
测试之后得到的结论是:
可以被哈希的数据结构:
int
、float
、str
、tuple
;不可以被哈希的数据结构:
dict
、list
、set
。
加上之前滚雪球学到的知识,可以了解到,可以被哈希的数据类型都是不可变的,而不可以被哈希的数据类型是可变的,有点绕,稍微停顿一下,多读两遍即可。
可哈希的对象通常用作
字典的键
和集合
的成员,因为这些数据结构在内部使用哈希值。
最终结论: 可哈希
≈ 不可变
。
11.3 Python hash() 函数
hash
函数用于获取一个对象的哈希值,语法结果为 hash(object)
,返回值是对象的哈希值, 哈希值是整数。
使用方式非常简单:
11.4 hashlib 模块
hashlib
提供了常见的摘要算法,具体如下:
md5()、sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()、blake2s()、sha3224()、sha3256()、sha3384()、 sha3512()、 shake128()、shake256()
使用 dir(hashlib)
即可获取上述所有可用方法。
MD5
是最常见的摘要算法,生成结果是固定的 16 字节,通常用一个 32 位的 16 进制字符串表示,示例代码如下:
SHA1 算法更安全,它的结果是 20 字节长度,通常用一个 40 位的 16 进制字符串表示。而比 SHA1 更安全的算法是 SHA256 和 SHA512 等,不过越安全的算法越慢,并且摘要长度更长。
11.5 这篇博客的总结
本篇博客为大家说明了 Python 的哈希表概念和可哈希对象,对于初学阶段是有帮助的。
深入研究下去,你应该尝试自己手写哈希算法与可哈希对象,再学习一段时间吧,希望本文对你有所帮助。
相关阅读
博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/6b7f64a2fcc10d3c0c5e38d5f】。文章转载请联系作者。
评论