Python 哈希表与可哈希对象
哈希表(散列表)
哈希是从 Hash 音译过去的,哈希表(hashtable),也叫做散列表。
哈希表是键值对的无序汇合,其每个键都是惟一的,外围算法是通过索引去查找值,Python 中的字典合乎哈希表构造,字典中每个键对应一个值,my_dict={"key1":"value1","key2":"value2"}
。
哈希是应用算法将 任意大小 的数据映射到固定长度输入的过程,该输入就是哈希值。
哈希算法能够创立高性能的数据结构,该构造能够疾速存储和拜访大量数据,哈希值通过哈希函数计算。
哈希函数,实质上是键到值的映射关系;
哈希表实质上就是一个数组,存储的是通过哈希函数运算之后失去的值;
哈希值是惟一标识数据的固定长度的数值。
这些都属于概念层面的常识,初期理解即可,前面随着利用会逐渐把握。
可哈希与不可哈希
这部分在 官网文档 说的比拟绕,简略说一下的论断(也是大家共识的),一个对象(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])
测试之后失去的论断是:
- 能够 被哈希的数据结构:
int
、float
、str
、tuple
; - 不能够 被哈希的数据结构:
dict
、list
、set
。
加上之前滚雪球学到的常识,能够理解到,能够被哈希的数据类型都是不可变的,而不能够被哈希的数据类型是可变的,有点绕,略微进展一下,多读两遍即可。
可哈希的对象通常用作
字典的键
和汇合
的成员,因为这些数据结构在外部应用哈希值。
最终论断:可哈希
≈ 不可变
。
Python hash() 函数
hash
函数用于获取一个对象的哈希值,语法后果为 hash(object)
,返回值是对象的哈希值,哈希值是整数。
应用形式非常简单:
print(hash('test'))
print(hash(1))
# 留神上面应用不可哈希对象会呈现谬误
# hash([1,2,3])
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())
SHA1 算法更平安,它的后果是 20 字节长度,通常用一个 40 位的 16 进制字符串示意。而比 SHA1 更平安的算法是 SHA256 和 SHA512 等,不过越平安的算法越慢,并且摘要长度更长。
这篇博客的总结
本篇博客为大家阐明了 Python 的哈希表概念和可哈希对象,对于初学阶段是有帮忙的。
深入研究上来,你应该尝试本人手写哈希算法与可哈希对象,再学习一段时间吧,心愿本文对你有所帮忙。