哈希查找

哈希是什么?为什么哈希存取比较快?

随声附和 提交于 2020-02-16 07:56:35
  不太恰当的比喻:     XM 指的是“小明”,也指的是“小萌”     XM就是哈希值,小明和小萌就是拥有同一个哈希值的,存在同一个链表的元素。     想要获取小萌,首先使用hashcode获取到这两个人,然后再通过equals获取到小萌。   个人理解      哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构 解决了数组的增删元素的不足和链表的查询效率的不足 。    数组是存在连续的存储空间,而链表的存储空间不连续 --------------------------------   哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。   哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。   哈希通过将单向数学函数(有时称为“哈希算法”

MySQL索引

柔情痞子 提交于 2020-02-12 06:35:31
1.B树与B+树的区别? 1. B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向data record的指针, 使得每个结点中能够存放更多的key, 树的层高能进一步被压缩, 使得检索的时间更短. 2. 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历 2.MySQL中HASH索引和B+树索引的区别? B+索引: B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接 在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。 哈希索引: 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。 两者的区别: 1. 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提 是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据 2. 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算 法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索 3. 同理

【转】MySql索引

与世无争的帅哥 提交于 2020-02-10 15:21:32
https://segmentfault.com/a/1190000010991930 索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。 在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。 B-TREE索引 B-TREE索引是使用最多的索引。很多存储引擎采用的都是B-TREE数据结构的变体实现该索引,例如InnoDB使用的是B+TREE,即每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点范围遍历。 不同存储引擎使用B-TREE索引的方式也不同。例如MyISAM使用前缀压缩技术使索引更小,而InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。 B-TREE中的所有值都是按顺序存储的,每个叶子页到根的距离相同。下图展示了InnoDB中的B-TREE索引是如何工作的: 当查找一行记录时,存储引擎会先在索引中搜索。从索引的根节点开始,通过比较节点页的值和要查找的值逐层进入下层节点,最底层叶子节点的指针指向的是被索引的数据。这样的查找方式避免了全表扫描,加快访问数据的速度。此外因为B-Tree对索引列是顺序存储的

Hash哈希(一)

眉间皱痕 提交于 2020-02-10 07:26:01
Hash哈希(一)    哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知识。本文参考了很多博文,感谢大家的无私分享。 基本概念    Hash,一般翻译做“散列”,也有直接音译为“哈希”的。那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系。   大家使用的最多的就是哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数或散列函数。    实际中的Hash主要有两种应用:加密和压缩。 在加密方面,Hash哈希是把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值,最广泛应用的Hash算法有MD4、MD5、SHA1。 在压缩方面,Hash 哈希 是指把一个大范围映射到一个小范围,往往是为了节省空间,使得数据容易保存。 Hash的特点    主要原理就是把大范围映射到小范围,因此输入范围必须和小范围相当或者比它更小,否则增加冲突。   Hash函数逼近单向函数,所以可以用来对数据进行加密。(单项函数:如果某个函数在给定输入的时候

数据库的索引和锁

荒凉一梦 提交于 2020-02-09 20:10:34
一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行 INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 -索引需要占物理和数据空间。 了解过索引的最左匹配原则 知道索引的分类:聚集索引和非聚集索引 Mysql支持Hash索引和B+树索引两种 看起来好像啥都知道,但面试让你说的时候可能就GG了: 使用索引为什么可以加快数据库的检索速度啊? 为什么说索引会降低插入、删除、修改等维护任务的速度。 索引的最左匹配原则指的是什么? Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗? 聚集索引和非聚集索引有什么区别? … 1.1聊聊索引的基础知识 首先Mysql的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 而每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 所以说,如果我们写 select*fromuserwhereusername='Java3y’这样没有进行任何优化的sql语句

REDIS 字典数据结构

淺唱寂寞╮ 提交于 2020-02-04 20:10:13
对于REDIS来讲 其实就是一个字典结构,key ---->value 就是一个典型的字典结构 【当然 对于vaule来讲的话,有不同的内存组织结构 这是后话】 试想一个这样的存储场景: key:"city" value:"beijing" 如果有若干个这样的键值对,你该怎么去存储它们呢 要保证写入和查询速度非常理想~! 抛开redis不说,如果你想要存储 快速查找的话, Hash算法是最快的,理想的哈希函数可以带来O(1)的查找速度,你都这样想,那么redis也的确采用这种方法来做~! 但是HASH算法有2个致命的弱点:1)填充因子不能太满 2)不好的HASH算法可能会导致一个冲突率非常高。 填充因子不能太满 这个理论上一般为0.5左右 过高 就是哈希槽都被塞满了 ,即使在好的哈希分布算法 也无法避免key冲突。 不好的哈希分布算法 丢到第一个因素来讲, 如果一个不好的哈希分布算法会导致了key分布不均匀,也就是通过哈希函数计算出来的哈希槽都是落在了一个桶里,这样的哈希分布算法是最不理想的,最理想的情况下是 保证每个key都落在不同的哈希槽里【哈希槽>key】 实际存储的哈希存储设计 1)一般来讲,哈希分布函数确定后,可调控的因子就是这个填充因子 如果填充因子大于你卡的某个阈值,那么你就要做哈希结构迁移工作,迁移到一个更大的哈希槽中。而对用同用的这种哈希分布 函数

HashMap 和 HashTable差别

别等时光非礼了梦想. 提交于 2020-02-04 07:53:31
代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter 以下是HashMap的作者: 以下代码及注释来自java.util.HashMap * @author Doug Lea * @author Josh Bloch * @author Arthur van Hoff * @author Neal Gafter 可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看这里。 3. 对外的接口(API) HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同,我们首先来看一下他们暴露在外的API有什么不同。 3.1 Public Method 下面两张图,我画出了HashMap和HashTable的类继承体系,并列出了这两个类的可供外部调用的公开方法。

HashMap和HashTable到底哪不同?

♀尐吖头ヾ 提交于 2020-02-04 07:45:38
          HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 /*--> */ /*--> */ 代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable* @author Arthur van Hoff* @author Josh Bloch* @author Neal Gafter 以下是HashMap的作者: 以下代码及注释来自java.util.HashMap* @author Doug Lea* @author Josh Bloch* @author Arthur van Hoff* @author Neal Gafter 可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看https://en.wikipedia.org/wiki/Doug_Lea。 3. 对外的接口(API)

MySQL索引 - 索引的类型

橙三吉。 提交于 2020-02-02 12:15:08
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是 按顺序存储 的,并且每一个叶子页到根的距离相同。 B-Tree 索引 能够 加快访问数据的速度 ,存储引擎 不再需要进行全表扫描 来获取需要的数据,取而代之的是 从索引的根节点开始搜索 。 B-Tree 索引 适用于全键值、键值范围或键前缀查找( 最左前缀原则 )。 哈希索引 哈希索引 基于哈希表实现,只有 精确匹配索引 所有列的查询才有效。 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。 哈希索引 自身 只需存储对应的哈希值和行指针 ,而 不存储字段值 ,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 哈希索引 数据并不是按照索引值顺序存储的,所以 无法用于排序 。 哈希索引 不支持部分索引列匹配查找 ,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。 哈希索引 不支持任何范围查询 ,如WHERE score > 60。 哈希索引 只支持等值比较查询 ,包括=、IN()、<=>(注意<>和<=>是不同的操作)。 介绍一个 使用场景 :如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。 创建表 1

哈希表

岁酱吖の 提交于 2020-01-30 01:56:50
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。   对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。   哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。   而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。 然而如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。 哈希表算法-哈希表的概念及作用   一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。