关于python:小手一抬学PythonPython-哈希表与可哈希对象

36次阅读

共计 1574 个字符,预计需要花费 4 分钟才能阅读完成。

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])

测试之后失去的论断是:

  • 能够 被哈希的数据结构:intfloatstrtuple
  • 不能够 被哈希的数据结构:dictlistset

加上之前滚雪球学到的常识,能够理解到,能够被哈希的数据类型都是不可变的,而不能够被哈希的数据类型是可变的,有点绕,略微进展一下,多读两遍即可。

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

最终论断:可哈希 不可变

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 的哈希表概念和可哈希对象,对于初学阶段是有帮忙的。

深入研究上来,你应该尝试本人手写哈希算法与可哈希对象,再学习一段时间吧,心愿本文对你有所帮忙。

正文完
 0