Python哈希表和可哈希对象哈希表(hashtable)Hash是Hash的音译,哈希表(hashtable),又称哈希表。哈希表是键值对的无序集合。每个键都是唯一的。核心算法是通过索引找到值。Python中的字典符合哈希表结构。字典中的每个键对应一个值。my_dict={"key1":"value1","key2":"value2"}。散列是使用算法将任意大小的数据映射到固定长度输出的过程,这就是散列值。哈希算法可以创建能够快速存储和访问大量数据的高性能数据结构,哈希值是通过哈希函数计算出来的。hash函数本质上是key到value的映射关系;哈希表本质上是一个数组,存储的是哈希函数运算后得到的值;哈希值是唯一标识数据的固定长度值。这些都是概念层面的知识,初期可以理解,后面会随着应用逐渐掌握。关于hashability和non-hashability的部分在官方文档中比较绕。得出的结论(也是大家一致认同的)是一个对象(Python中的一切都是对象)在其生命周期内是保持不变的,也就是可以被hash。希腊语(可散列)。还有一种更简单的方法可以证明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、元组;不能散列的数据结构:dict、list、set。加上之前滚雪球学到的知识,我们可以了解到,可以哈希的数据类型是不可变的,而不能哈希的数据类型是可变的。传过去就行了。可散列对象经常用作字典的键和集合的成员,因为这些数据结构在内部使用散列值。最终结论:hashable≈immutable。Pythonhash()函数哈希函数用于获取一个对象的哈希值,语法结果为hash(object),返回值为对象的哈希值,哈希值为整数。用法很简单:print(hash('test'))print(hash(1))#注意下面使用unhashableobjects时会报错#hash([1,2,3])hashlib模块hashlib提供common摘要算法,具体如下: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位的十六进制字符串表示。示例代码如下:importhashlib#MD5算法md5=hashlib.md5()data="helloworld"md5.update(data.encode('utf-8'))#计算hash值得到加密后的字符串print(md5.hexdigest())SHA1算法比较安全,它的结果是20字节长,通常用40位的十六进制字符串表示。比SHA1更安全的算法有SHA256和SHA512等,但是更安全的算法速度更慢,摘要长度也更长。本篇博客总结本篇博客讲解了Python的哈希表和可哈希对象的概念,对初学者很有帮助。进一步研究之后,你应该尝试写自己的散列算法和可散列对象,研究一段时间。希望这篇文章对您有所帮助。
