哈希算法

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

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

经验整理-18-memcached-100-@

旧城冷巷雨未停 提交于 2020-02-15 19:10:47
memcached是怎么工作的? 当查询数据时,客户端 首先(参考节点列表)计算出入参key的哈希值(阶段一哈希),找到对应节点 ;然后 memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item) 。 举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C: Client 1想把数据”barbaz”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key “foo”把数据”barbaz”存储进去。  Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。 于是,经过相同的哈希计算(阶段一),Client 2计算出key “foo”在memcached B上,然后它直接请求memcached B,得到数据”barbaz”。 各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。 最后,从实现的角度看

哈希算法(下):哈希算法在分布式系统中有哪些应用?

怎甘沉沦 提交于 2020-02-15 06:55:53
哈希算法(下):哈希算法在分布式系统中有哪些应用? 还有三种哈希算法的应用:负载均衡、数据分片、分布式存储 应用五:负载均衡 负载均衡的算法有很多,比如轮询、随机、加权轮询等,如何实现一个会话粘滞的负载均衡算法呢?即在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上 方法是:维护一张映射关系表,表中内容是客户端IP地址或者会话ID与服务器编号的映射关系,客户端发出的每次请求都需要先在映射表中查找应该路由到的服务器编号,再请求编号对应的服务器 可以借助哈希算法,对客户端IP地址或者会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号,这样就可以把同一个IP过来的所有请求都路由到同一个后端服务器上 应用六:数据分片 1.统计“搜索关键词”出现的次数 假如有1T日志文件,记录了用户的搜索关键词,需要快速统计出每个关键词被搜索的次数,怎么做? 两个难点:一是搜索日志很大,没有办法放到一台机器内存中去,二是如果只用一台机器处理的话花费时间很长 先对数据进行分片,然后采用多台机器处理的方法,来提高速度,思路是:用n台机器并行处理,从搜索记录的日志文件中依次读出每个搜索关键词,并通过哈希函数计算哈希值,再跟n取模,最终得到的值就是应该被分配到的机器编号,这样哈希值相同的搜索关键词就被分配到同一机器上

数据结构中的hash

自作多情 提交于 2020-02-10 07:25:50
最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法。那么到底什么是哈希(hash)。查找资料发现一个比较有意思的解释,在此分享一下。 人家说的很好我就直接粘过来。 ============================================================================================================================ 但凡是从事过计算机行业的人,多多少少都会听说过这个概念,但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统称为哈希(这么叫好听,哈希=散列),通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。 我所理解的哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。 哈希函数、算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改一个字母的段落,随后的哈希都将产生不同的值

字符串哈希算法

女生的网名这么多〃 提交于 2020-02-03 04:50:49
哈希算法 字符串的哈希算法,通俗的理解,就是将一个字符串,转化成整数 原来我们进行字符串匹配的时候,就是一个个去匹配,那么时间复杂度是o(n),如果转化成数字,去匹配那么时间复杂度会变成o(1)。 哈希算法的引入 首先联想一下二进制数,对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): 1101101=1 * 2 ^ 6+1 * 2 ^ 5+0 * 2 ^ 4+1 * 2 ^ 3+1 * 2 ^ 2+1*2 ^1+1 这是二进制转化为十进制 那么如果我们想把字符串转化成十进制的整数,那么我们是不是就可以把这个字符串设为p进制的数,然后将a~z的字母设为1 ~26,那么我们在进行转化的时候是不是就可以按照二进制转换成十进制那样那么哈希就是经过一个转换,再模上一个q,就是哈希的解法了。 上图是我们以字符串abc为示范 得到的结果就是我们想要的整数,但是在有时候,难免会出现,两个字符串不相同但是整数相同的情况,为了尽量减少这种情况,我们把p往往取为131或者13331,然后q我们一般取2的64次方,因为我们把哈希算出来的整数存放在unsigned long long 中,而这个类型的数据溢出就相当于系统自动帮你进行2的64次方取模运算,所以我们在算哈希值的时候,就可以不用取模了。 哈希值 我们在算一个字符串的哈希值的时候,会把前缀的哈希值都算出来

哈希算法

假装没事ソ 提交于 2020-02-02 05:41:13
哈希算法 这个算法可以在一个字符串中 迅速判断两个字串是否相同 。 根据朴素算法,我们直接将两个字串相比较,遇到不同的字符就break,这样的时间复杂度是o(n),而改进后的哈希算法的时间复杂度为o(1)。 下面我们来具体看看哈希算法(先假设字符串中皆为小写字母): 将字符串中的26个小写字母转换为数字,然后将每一个前缀的p进制的哈希值算出,通过 比较对应的哈希值来确定两个字串是否相同 。当然,p一般取131或13331,因为这样可以最大可能降低相同率,避免两个不同的字符串有相同的哈希值。由于字符串长度未知,哈希值可能会超过long long int的长度,但即使溢出也没有关系,溢出的值以long long int为例,会对2^64取模,对结果无太大关系。 以字符串str[]={a,b,c}为例: 先转化为数字:1 2 3; 为了方便运算,hash[0]=0; 计算每一个前缀的hash值(转化为131进制数): hash[a]=h[0]^131+str[1]-‘a’+1=1; hash[ab]=hash[a]^131+str[2]-‘a’+1=133; hash[abc]=hash[ab]^131+str[3]-‘a’+1=17426; 此时,若是要知道字符串里两个字串是否相等则只要计算两个字串的哈希值是否相等即可。 如字符串s={a,b,c,a,b,c,g}; 计算s[r]到s

哈希算法>>入门篇

感情迁移 提交于 2020-02-02 00:40:40
两段字符串,判断它们是否相等,朴素解法是一个一个的判断,时间复制度较大。哈希算法把字符串转换成整数,这样时间复杂度从O(N)变成了O(1)。类似于二进制,用P进制将字符串装换成整数,为避免重复,一般认为P取131或者1331,使用unsigned long long 就可以,默认对结果模一个2^64,会有溢出的情况,但影响很小。(字符串默认都是小写字母,采用26进制) 例如 str=“abcd" Hash(str)= Hash数组存储字符串所有的前缀(憨憨小白不会打次方:p) 这里还可以用到简单的递归 Hash[i]=Hash[i-1]*P+s[i]-‘a’+1 对于字符串任意区间(L,R) Hash[L–R]=Hash[R]-hash[L-1]*P^(R-L+1) 简单验证即可得到 例题链接 代码实现 # include <stdio.h> # include <string.h> # define base 131 char s [ 1000000 ] ; typedef unsigned long long ULL ; ULL h [ 1000001 ] , p [ 1000001 ] ; ULL ans ( int left , int right ) { return h [ right ] - h [ left - 1 ] * p [ right - left + 1

借助哈希算法实现高效字符串匹配算法

不羁岁月 提交于 2020-01-28 17:35:11
BF 算法,暴力匹配算法,每次往后移一位 RK 算法,通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的。 但是需要遍历子串中的每个字符,算法整体的效率并没有提高 提高哈希算法 二十六进制来表示一个字符串:把 a~z 这 26 个字符映射到 0~25 这 26 个数字,a 就表示 0,b 就表示 1; 相邻两个子串的哈希值的计算公式有一定关系 ,可以使用 s[i-1]的哈希值很快的计算出 s[i]的哈希值 26^(m-1) 这部分的计算,我们可以通过查表的方法来提高效率。我们事先计算好 26 0、26 1、26 2……26 (m-1),并且存储在一个长度为 m 的数组中,公式中的“次方”就对应数组的下标。当我们需要计算 26 的 x 次方的时候,就可以从数组的下标为 x 的位置取值,直接使用,省去了计算的时间。 只需要扫描一遍主串O(n),模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,整体的 时间复杂度就是 O(n)。 来源: CSDN 作者: lwj~ 链接: https://blog.csdn.net/qq_41754573

分布式哈希和一致性哈希算法

时间秒杀一切 提交于 2020-01-18 17:25:33
目录 1、数据分布 2、哈希方式 3、一致性哈希方式 笔记来自分布式原理一书,供个人学习。 数据分布 单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得 分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题,我们称这样的数据拆解为数据分布方式。 哈希方式 哈希方式是最常见的数据分布方式,其方法是按照数据的某一特征计算哈希值,并将哈希值与机器中的机器建立映射关系,从而将不同哈希值的数据分布到不同的机器上。所谓数据特征可以是 key-value 系统中的 key,也可以是其他与应用业务逻辑相关的值。例如,一种常见的哈希方式是按数据属于的用户 id 计算哈希值,集群中的服务器按0到机器数减 1 编号,哈希值除以服务器的个数,结果的余数作为处理该数据的服务器编号。工程中,往往需要考虑服务器的副本冗余,将每数台(例如 3)服务器组成一组,用哈希值除以总的组数,其余数为服务器组的编号。图 2-1 给出了哈希方式分数据的一个例子,将数据按哈希值分配到 4 个节点上。 哈希方式特点 : 1.每个节点只计算一部分数据;每个节点只存储一部分数据。 我们假设节点的数量没有变化(实际上不可能)

第五章-索引与算法

别等时光非礼了梦想. 提交于 2020-01-18 02:17:31
5.1 InnoDB存储引擎索引概述 183 InnoDB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 InnoDB 存储引擎支持的哈希索引是自适应的,InnoDB 存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。 B+树索引目前关系型数据库系统中查找最为常用和最为有效的索引。 B+树索引并不能找到一个给定键值的具体行,只能找到对应的页,然后把页读到内存,再在内存中进行查找。 5.2 数据结构与算法 184 5.2.1 二分查找法 184 5.2.2 二叉查找树和平衡二叉树 185 5.3 B+树 187 5.3.1 B+树的插入操作 187 5.3.2 B+树的删除操作 190 5.4 B+树索引 191 根据叶子节点存放的是否是一整行的信息,可将数据库中的B+树索引分为聚集索引(clustered inex)和辅助索引(非聚集索引)(secondary index) 5.4.1 聚集索引 192 聚集索引(clustered index)就是按照每张表的主键构造一棵 B+树,同时叶子节点中存放的即为表的行记录数据(所有叶子节点加起来就是整张表的行记录数据),也将聚集索引的叶子节点称为数据页。 聚集索引的存储并不是物理上连续的,而是逻辑上连续的。 5.4.2 辅助索引 196 对于辅助索引(Secondary Index