Hash

  基本思想:将数据表中记录的数据通过某个函数转换为一个固定长度的哈希值,这个值可以解释为存储空间的地址。根据哈希值和生成哈希值的关键字的值建立的k-v表就是哈希表。(注意,这个并不是真正的物理内存地址,之前有好长一段时间都理解错了。)
  哈希冲突:因为这个并不是真正的唯一物理地址,然后不管是因为算法的缺陷还是说关键字的随机性太强,所以会出现哈希值相同的情况,这就是哈希冲突了。(在Java中的现象就是当两个对象equals的时候,hashcode一定相等,但是hashcode相等的时候就不一定equals了)
  哈希冲突解决:


hash冲突

  开散列:这个就是数据以链表的形式存储在哈希值对应的value上面。Java的HashMap就是这么干的。


开散列

  闭散列:检查发生冲突的哈希值的下个单元,如果是空的,那就放到下个单元格,如果下个地址到底了,就放到头部。但是这有个问题,所有的哈希值都排满咋整,就只能重散列,将值放到更大的表中。


闭散列

上图f的哈希值是1,但是1已经有对应了,就放到下个非空的存储地址了。

你可能感兴趣的:(Hash)