首页 > 编程知识 正文

哈希算法原理和用途,原来我也有___作文500字

时间:2023-05-03 20:48:00 阅读:9430 作者:4081

什么是phdzdj算法? 将任意长度的二进制值列映射到固定长度的二进制值串。 映射规则是指phdzdj算法映射原始数据后得到的二进制值列是指phdzdj值2 phdzdj算法的性能无法从phdzdj值中反向提取原始数据

因此,phdzdj算法也被称为单向phdzdj算法对输入数据敏感

即使原始数据只修改了1位,最后的phdzdj值差异很大的散列冲突的概率也很低

也就是说,根据原始数据的不同,phdzdj的值相同的概率非常小,执行效率必须尽量高效

这些定义和要求在理论上可能仍然难以理解,以便即使对于长文本,也能快速计算phdzdj值。 具体说明MD5这样的phdzdj算法。

例如:

两个字符串(公共编号JavaEdge )计算MD5phdzdj的值,得到两个看起来不规则的字符串。 (MD5的phdzdj的值为128位的位长,为了便于显示,转换为十六进制代码。

无论phdz-DJ的文本有多长有多短,通过MD5phdzdj后,得到的phdz-DJ值长度相同,而且得到的phdz-DJ值看起来像一堆随机数,完全不规则。

MD5 (“公众号”)=215 feec 56c2AE2EB C5 c15 E0 BF 7ba f 63b

MD5(「Javaedge”)=a2a 78e e5e 4c9c 0547 a6 e9acca 6b 54393

“公众号! ”“公众号”。 这两个字符串只是叹息。 但是,MD5后的混列值差异很大:

MD5 )“公众号! ”(c9a 7de 168253 f 3d 653 b 6d b1b 35 ba b5 a 8

MD5 (“公众号”)=215 feec 56c2AE2EB C5 c15 E0 BF 7ba f 63b

看吧,用计算出的哈希值,很难将原始数据反过来吧?

3应用方案3.1安全加密常用加密的phdzdj算法:

MD5 (m D5消息摘要算法,MD5消息摘要算法) sha (安全散列算法,安全散列算法) des (数据加密)

任何phdzdj算法都只能尽量减少碰撞碰撞的概率,理论上完全不能避免碰撞。 为什么会这样呢?

如果说有10个鸽子窝,11个鸽子的话,那么鸽子窝里一定有比1个鸽子多的数量。 换句话说,一个窝里一定有两只鸽子。

由phdz-DJ算法生成的phdz-DJ值的长度是固定的和有限的。 例如,在上面的MD5示例中,phdzdj值是固定的128位二进制列,可以显示有限的数据,最多可以显示2^128个数据,但phdzdj数据是无限的。 根据鸽巢原理,对2 ̄128个数据求phdzdj值,phdzdj值可能一定相同。

phdzdj值越长的phdzdj算法,散列冲突的概率越低。

即使phdzdj算法存在散列冲突,由于phdzdj值范围广,冲突概率极低,也相对难以破译。 有2^128个不同的phdzdj值,如MD5。 由于该数据已经是天文数字,散列冲突的概率小于1/2^128。

如果我们想要得到MD5phdzdj值,并以不规则的穷举方式找到与这个MD5值相同的其他数据,那么花费的时间应该是天文数字。 因此,即使phdzdj算法存在冲突,在有限的时间和资源上,也很难解密phdzdj算法。

没有绝对安全的加密。 越复杂、越难破解的加密算法,计算时间也越长。 例如,SHA-256比SHA-1更复杂、更安全,相应地计算时间也更长。 加密学界也在致力于发现高速且难以解读的phdzdj算法。

必须比较和研究解密的难度和计算时间,以确定使用哪个加密算法。

在phdzdj算法中,用户密码可以在加密后保存,但建议选择相对安全的加密算法,如SHA (因为据说MD5已经被解密)。 但是,只是这样加密,存储一切顺利吗?

词典攻击用户信息被“脱库”时,黑客得到了加密的密文,但可以通过“推测”解密密码。 因为也有密码太简单的用户。 例如00000、123456这样的简单数字组合,所以至今仍要求大小写的英文数字一致。

必须维护常用密码的词典表,使用phdzdj算法计算词典中的每个密码的phdzdj值,并将phdzdj值与卸下库的密文进行匹配。 如果相同,则基本上认为与该加密密码对应的明文是词典的该密码。 (phdzdj算法有散列冲突,密文可能相同,但明文不同)

可以引入“盐”(salt )以结合用户密码来增加密码的复杂性。 用phdzdj算法对组合字符串进行加密,保存在数据库中,进一步增加解密难度。

3.2唯一识别大数据的信息摘要,用短二进制代码表示大数据。

在大量的图库中搜索图,并不容易通过图像元信息(例如图像名称)进行匹配。 可能:

名字一样,但内容不同。 内容是一样的,但到底该怎么搜索呢?

每个文件在计算中都是2

进制码序列,所以,比较粗暴的就是将待搜索图片的二进制码序列与图库中所有图片二进制码序列一一比对。

但问题是,图片大小从几K~几M,转化成二进制就是一个超长的序列,比对极为耗时!怎么能更快?

可以给每个图片取个唯一标识或信息摘要。

比如,可以从图片的二进制码序列:

开头取100个字节中间取100个字节最后再取100个字节

将这300个字节放到一块,通过phdzdj算法(如MD5),得到一个phdzdj字符串,将其作为图片唯一标识。

还能更快吗?

把每个图片的唯一标识和相应图片文件在图库中的路径信息,都存储在hash表。

搜索某图片时:

通过phdzdj算法对该图片取唯一标识在hash表查找是否存在该标识: 不存在
该图片不在图库存在
再通过hash表中存储的文件路径,获取该已存在图片,跟现在要插入的图片做全量比对,看是否完全一样: 一样
说明已经存在不一样
说明两张图片尽管唯一标识相同,但并非相同图片 3.3 数据校验

P2P下载,从多个机器并行下载一个2G电影,该电影文件可能被分割成很多文件块。等所有的文件块都下载完成之后,再组装成一个完整的电影文件就行了。

网络传输是不安全的,下载的文件块有可能是被宿主机器恶意修改过的,又或者下载过程中出现了错误,所以下载的文件块可能不是完整的。如果没有能力检测这种恶意修改或者文件下载出错,就会导致最终合并后的电影无法观看,甚至导致电脑中毒。

如何校验文件块的安全、正确、完整?

使用phdzdj算法对100个文件块分别取phdzdj值,并保存在种子文件。

只要文件块内容有丁点改变,最后phdzdj值就完全不同。

所以,当文件块下载完成后:

使用相同phdzdj算法对下载好的文件块逐一求phdzdj对比种子文件中的phdzdj值: 若不同
说明该文件块不完整或被篡改,重新从其它宿主机器下载该文件块 3.4 Hash函数

该场景:

对hash算法冲突的要求较低,偶尔hash冲突问题不大也不关心hash函数对于hash算法计算得到的值,是否能反向解密

hash函数中用到的hash算法,更加关注hash后的值是否能均匀分布。
hash函数执行的快慢,也影响hash表的性能,所以,hash函数用的hash算法一般较简单,追求效率。

phdzdj算法还能解决很多分布式问题。

3.5 负载均衡

实现一个会话粘滞(session sticky)负载均衡算法,需在同一客户端上,在一次会话中的所有请求都路由同一服务器。

最直接的维护一张映射关系表:
客户端IP地址或会话ID =》服务器编号的映射关系

客户端发出的每次请求,先映射表查找路由的服务器编号,再请求对应服务器。
简单直观,但:

客户端很多
映射表可能会很大,比较浪费内存空间客户端下线、上线,服务器扩容、缩容都会导致映射失效
维护映射表的成本很大

借助phdzdj算法即可解决:对客户端IP地址或会话ID计算phdzdj值,与服务器列表的大小取模,最终得到的值即被路由到的服务器编号。
这就可以把同一IP过来的所有请求,都路由到同一后端服务器。

3.6 数据分片 统计关键词

假如1T日志文件,这里面记录了用户的搜索关键词,快速统计出每个关键词被搜索的次数。
这个问题有两个难点:

搜索日志很大,没法放到一台机器的内存如果只用一台机器来处理这么巨大的数据,处理时间会很长。

可以先对数据进行分片,然后采用多台机器处理提高处理速度:
用n台机器并行处理:

从搜索记录的日志文件依次读出每个搜索关键词通过phdzdj函数计算phdzdj值再跟n取模得到应该被分配到的机器编号

phdzdj值相同的搜索关键词就被分配到了同一个机器上。即同一个搜索关键词会被分配到同一个机器上。每个机器会分别计算关键词出现的次数,最后合并起来就是最终的结果。

MapReduce的基本思想。

快速判断图片是否在图库

前面提到可以给每个图片取唯一标识(或者信息摘要),然后构建hash表。

现在图库现有1亿张图片,单机构建hash表就做不到了。因为单台机器的内存有限,而1亿张图片构建散列表显然远远超过了单台机器的内存上限。

我们同样可以对数据进行分片,然后采用多机处理。我们准备n台机器,让每台机器只维护某一部分图片对应的散列表。我们每次从图库中读取一个图片,计算唯一标识,然后与机器个数n求余取模,得到的值就对应要分配的机器编号,然后将这个图片的唯一标识和图片路径发往对应的机器构建散列表。

当我们要判断一个图片是否在图库中的时候,我们通过同样的phdzdj算法,计算这个图片的唯一标识,然后与机器个数n求余取模。假设得到的值是k,那就去编号k的机器构建的散列表中查找。

现在,我们来估算一下,给这1亿张图片构建散列表大约需要多少台机器。

散列表中每个数据单元包含两个信息,phdzdj值和图片文件的路径。假设我们通过MD5来计算phdzdj值,那长度就是128比特,也就是16字节。文件路径长度的上限是256字节,我们可以假设平均长度是128字节。如果我们用链表法来解决冲突,那还需要存储指针,指针只占用8字节。所以,散列表中每个数据单元就占用152字节(这里只是估算,并不准确)。

假设一台机器的内存大小为2GB,散列表的装载因子为0.75,那一台机器可以给大约1000万(2GB*0.75/152)张图片构建散列表。所以,如果要对1亿张图片构建索引,需要大约十几台机器。在工程中,这种估算还是很重要的,能让我们事先对需要投入的资源、资金有个大概的了解,能更好地评估解决方案的可行性。

海量数据处理都可采用多机分布式处理方案。分片设计以突破单机内存、CPU等资源的限制。

3.7 分布式存储

为提高数据读、写能力,一般采用分布式存储,比如分布式缓存。因为大量数据要缓存,所以单机缓存肯定不够,就需要将数据分布在多机。

哪个数据又该存在哪个机器呢?

参考数据分片设计,通过phdzdj算法处理数据,然后对机器个数取模,就得到该缓存数据应存储的机器编号。

但若数据增多,原先10个机器已无法支撑,就得扩容,比如扩到11个节点。
但问题也来了,原先数据通过与10取模,现在节点多了一个,所有数据需重新计算phdzdj值,然后迁移到现在的对应节点。
这时,原缓存中的数据突然大量失效,这些缓存数据的请求就会穿透缓存,直接请求DB。

所以,此时我们就需要一个方案,能在加新节点后,无需做大量数据迁移。
救星就是一致性 hash 算法!

先假设:

有k个节点数据phdzdj值范围[0, MAX]将整个范围划分成m个小区间(m>>k)每个节点负责m/k个小区间

加入新节点时,就将某几个小区间的数据,从原节点迁移至新节点。
这就避免了全部重新phdzdj、搬移数据,也保持了各个机器上数据数量的均衡。

这就是一致性phdzdj算法的基本思想。

案例

钟表有 60 分钟,从 0 开始到 59,共 60 个点。
现在将机器往这 60 个点分配,规则如下:

hash(ip) % 60

假设 3 台机器 A,B 和 C,分别被分配到了 14,37 和 46 三个点。

图片的分配规则类似:

hash(image_id) % 60

现有 3 张图片 x, y, z,分别被分配到 5,30,50 这三个点。

图片都没被分配到机器的节点,这咋办?
在钟表上顺时钟往前寻找,第一台遇到的机器,就是它的归属。

不凑巧,A B C 三台机器分别分配到 5,10,15 这三个点。这样对 A 很不公平啊!要负责存储绝大多数的图片,那这怎么办呢?

为避免不必要争端,于是引入“虚拟节点”,每台机器都可拔一根汗毛,变成若干台,把虚拟节点分散到 60 个点,归属“虚拟节点”的图片,均保存到它的真身。这就能解决分配不均匀问题。

应用时,将 60 替换下即可,如替换为 2^32。

参考

https://en.wikipedia.org/wiki/Consistent_hashinghttps://www.zsythink.net/archives/1182

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。