23-3 hash 方法
hash方法 |
- 底层数据结构基于hash值寻址的优化操作
- hash是一个算法
- 能够把某一个要存在内存里的值通过一系列计算,
- 保证不同值的hash结果是不一样的
hash(obj) #obj内部必须实现了__hash__方法
假设: 得到一个哈希值
'127647862861596' 哈希==> 927189778748
对同一个值在多次执行python代码的时候hash值是不同
但是对同一个值 在同一次运行python代码的时候hash值永远不变
print(hash('abc')) # 6048279107854451739 同一次运行print(hash('abc')) # 6048279107854451739print(hash('abc')) # 6048279107854451739print(hash('abc')) # 6048279107854451739print(hash('abc')) # 6048279107854451739print(hash('abc')) # 6048279107854451739
想想为什么字典寻址比较快?
# 字典的寻址 - hash算法 d = {'key':'value'} hash - 内置函数 # 假如hash(key)= 297111XXX ,得到了物理地址 (key是可哈希的) # 我们就把value 存在这个地址里 (想想C的指针) # 这样就很快,取值d = {'key':'value'} ,不像列表循环取值
想想set集合是如何去重的?
se = {1,2,2,3,4,5,'a','b','d','f'} print(se) # {1, 2, 3, 4, 5, 'd', 'f', 'b', 'a'} # 是因为把每个值哈希一下,通过哈希得到的结果存到内存,当取到的值哈希结果也是一样的,所以把他存在内存中,就相当于覆盖了。 # 所以好像不是很保险?加入哈希值恰巧一样了,不都覆盖了吗?? # 非也,set集合先判断哈希是否想等,再判断值是否相等 , #那我们为什么不直接先判断值相等? 愚蠢,效率啊! 哈希值快得多! 所以先哈希,实在相等了,再判断值嘛(概率很小哇)
字典也是一样的
d = {'key':'v1','key':'v2'} print(d['key']) #v2