什么叫hash,Hash值有什么用处
什么是可散列的?
一个对象是可散列的,这意味着它在其生命周期中有一个恒定的散列值。也就是说,同一个对象使用hash(object)计算出来的值是相同的,比如list对象。改变一个元素的值后,同一个列表计算出来的哈希值是不一样的,所以这个列表是不可哈希的。什么是哈希算法?
哈希算法将一个任意长度的二进制值映射成一个更小的固定长度的二进制值,称为哈希值。哈希值是一段数据的唯一且极其紧凑的数字表示。如果对一段纯文本进行哈希运算,即使只改变段落的一个字母,经过哈希算法计算后也会产生不同的值。
python中hashlib库提供的哈希算法有 MD5 , SHA1 , SHA224 , SHA256 , SHA384 , SHA512 SHA是安全哈希算法的缩写,sha1 sha224是不同数字的实现。看一个散列算法和散列值的例子:
hashlib.md5(1 )。hexdigest()
c4ca 4238 a0b 923820 DCC 509 a6f 75849 b
hashlib.md5(倪好)。hexdigest()
194 ce 5d 0 b 89 c 47 ff 6b 30 bfb 491 f 9 DC 26
hashlib.sha1(倪好)。hexdigest()
23 fcf 96d 70494 b 81 c 5084 c 0 da 6a 6 e 8d 84 a9 C5 d 20
即通过哈希算法计算一个对象,得到一个不太可能重复的值。什么是哈希表?
哈希表根据设定的哈希函数H(key)和冲突处理方法,将一组关键字映射到有限的地址区间,将关键字在地址区间的图像作为记录在表中的存储位置。这个表叫做哈希表或hash,得到的存储位置叫做hash地址或hash地址。简单理解为一个由key计算的哈希值和一个存储对象组成的表,比如python中的dict。为什么哈希表存储和查找速度快(O(1))?
hash算法的快速访问是因为它通过关键字key直接获取要访问的记录的内存地址,然后直接读取或写入地址。
整个散列过程实际上分为两步:
(1)存储时,通过哈希函数计算记录的哈希地址,根据这个哈希地址存储记录。
(2)在寻找记录时,我们用同一个哈希函数计算记录的哈希地址,用这个哈希地址访问记录。因为访问使用相同的散列函数,所以结果当然是相同的。
简单理解:
用哈希算法把你的传入键计算成一个地址值,就像一个指针,指向内存中的某个区域。保存时,根据该地址值,将该值存储在该地址值映射的存储区中。读取时,地址值也会用密钥进行哈希运算得到,结果直接从对应的内存区读取,所以时间复杂度为O(1)。