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

举报
梦想橡皮擦 发表于 2021/07/30 17:33:12 2021/07/30
【摘要】 橡皮擦,一个逗趣的互联网高级网虫,新的系列,让我们一起 Be More Pythonic。 十一、Python 哈希表与可哈希对象 11.1 哈希表(散列表)哈希是从 Hash 音译过来的,哈希表(hashtable),也叫做散列表。哈希表是键值对的无序集合,其每个键都是唯一的,核心算法是通过索引去查找值,Python 中的字典符合哈希表结构,字典中每个键对应一个值,my_dict={"ke...

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

十一、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])

测试之后得到的结论是:

  • 可以被哈希的数据结构:intfloatstrtuple
  • 不可以被哈希的数据结构:dictlistset

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

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

最终结论: 可哈希不可变

11.3 Python hash() 函数

hash 函数用于获取一个对象的哈希值,语法结果为 hash(object),返回值是对象的哈希值, 哈希值是整数。
使用方式非常简单:

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

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

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

11.5 这篇博客的总结

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

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

博主 ID:梦想橡皮擦,希望大家点赞评论收藏

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。