ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-03-13 12:01:35  阅读:225  来源: 互联网

标签:set Python 滚雪球 表与 哈希 test my


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

滚雪球学 Python 第二轮

已完成的文章清单

  1. 滚雪球学 Python 第二轮开启,进阶之路,列表与元组那些事儿
  2. 说完列表说字典,说完字典说集合,滚雪球学 Python
  3. 关于 Python 中的字符串,我在补充两点,滚雪球学 Python
  4. 列表推导式与字典推导式,滚雪球学 Python
  5. 滚雪球学 Python 之 lambda 表达式
  6. 滚雪球学 Python 之内置函数:filter、map、reduce、zip、enumerate
  7. Python 中级知识之装饰器,滚雪球学 Python
  8. 滚雪球学 Python 之闭包操作,本系列第 8 篇文章
  9. 滚雪球学 Python 之怎么玩转时间和日期库
  10. 滚雪球学 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])

测试之后得到的结论是:

  • 可以被哈希的数据结构: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 的哈希表概念和可哈希对象,对于初学阶段是有帮助的。

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

相关阅读

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 108 / 200 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

标签:set,Python,滚雪球,表与,哈希,test,my
来源: https://blog.csdn.net/hihell/article/details/114648117

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有