23-3 hash 方法

hash方法

  1. 层数据结构基于hash值寻址的优化操作
  2. hash是一个算法
  3. 能够把某一个要存在内存里的值通过一系列计算,
  4. 保证不同值的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'}    ,不像列表循环取值
View Code

 

想想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

 

posted @ 2020-04-05 16:25  蜗牛般庄  阅读(134)  评论(0编辑  收藏  举报
Title
页脚 HTML 代码