当前位置:首页 > 经验 >

哈希算法详解图解(哈希算法最简单的解释)

来源:原点资讯(www.yd166.com)时间:2022-11-18 03:12:16作者:YD166手机阅读>>

要了解一致性哈希,首先我们必须了解传统的哈希及其在大规模分布式系统中的局限性。简单地说,哈希就是一个键值对存储,在给定键的情况下,可以非常高效地找到所关联的值。假设我们要根据其邮政编码查找城市中的街道名称。一种最简单的实现方式是将此信息以哈希字典的形式进行存储 <Zip Code,Street Name> 。

当数据太大而无法存储在一个节点或机器上时,问题变得更加有趣,系统中需要多个这样的节点或机器来存储它。比如,使用多个 Web 缓存中间件的系统。 那如何确定哪个 key 存储在哪个节点上?针对该问题,最简单的解决方案是使用哈希取模来确定。 给定一个 key,先对 key 进行哈希运算,将其除以系统中的节点数,然后将该 key 放入该节点。同样,在获取 key 时,对 key 进行哈希运算,再除以节点数,然后转到该节点并获取值。上述过程对应的哈希算法定义如下:

node_number = hash(key) % N # 其中 N 为节点数。

下图描绘了多节点系统中的传统的哈希取模算法,基于该算法可以实现简单的负载均衡。

哈希算法详解图解,哈希算法最简单的解释(1)

阅读更多关于 Angular、TypeScript、Node.js/Java 、Spring 等技术文章,欢迎访问我的个人博客 —— 全栈修仙之路

一、传统哈希取模算法的局限性

下面我们来分析一下传统的哈希及其在大规模分布式系统中的局限性。这里我们直接使用我之前所写文章 布隆过滤器你值得拥有的开发利器 中定义的 SimpleHash 类,然后分别对 semlinker、kakuqo 和 test 3 个键进行哈希运算并取余,具体代码如下:

public class SimpleHash { private int cap; private int seed; public SimpleHash(int cap, int seed) { this.cap = cap; this.seed = seed; } public int hash(String value) { int result = 0; int len = value.length(); for (int i = 0; i < len; i ) { result = seed * result value.charAt(i); } return (cap - 1) & result; } public static void main(String[] args) { SimpleHash simpleHash = new SimpleHash(2 << 12, 8); System.out.println("node_number=hash(\"semlinker\") % 3 -> " simpleHash.hash("semlinker") % 3); System.out.println("node_number=hash(\"kakuqo\") % 3 -> " simpleHash.hash("kakuqo") % 3); System.out.println("node_number=hash(\"test\") % 3 -> " simpleHash.hash("test") % 3); } }

以上代码成功运行后,在控制台会输出以下结果:

node_number=hash("semlinker") % 3 -> 1 node_number=hash("kakuqo") % 3 -> 2 node_number=hash("test") % 3 -> 0

基于以上的输出结果,我们可以创建以下表格:

哈希算法详解图解,哈希算法最简单的解释(2)

1.1 节点减少的场景

在分布式多节点系统中,出现故障很常见。任何节点都可能在没有任何事先通知的情况下挂掉,针对这种情况我们期望系统只是出现性能降低,正常的功能不会受到影响。对于原始示例,当节点出现故障时会发生什么?原始示例中有的 3 个节点,假设其中 1 个节点出现故障,这时节点数发生了变化,节点个数从 3 减少为 2,此时表格的状态发生了变化:

哈希算法详解图解,哈希算法最简单的解释(3)

很明显节点的减少会导致键与节点的映射关系发生变化,这个变化对于新的键来说并不会产生任何影响,但对于已有的键来说,将导致节点映射错误,以 “semlinker” 为例,变化前系统有 3 个节点,该键对应的节点编号为 1,当出现故障时,节点数减少为 2 个,此时该键对应的节点编号为 0。

1.2 节点增加的场景

在分布式多节点系统中,对于某些场景比如节日大促,就需要对服务节点进行扩容,以应对突发的流量。对于原始示例,当增加节点会发生什么?原始示例中有的 3 个节点,假设进行扩容临时增加了 1 个节点,这时节点数发生了变化,节点个数从 3 增加为 4 个,此时表格的状态发生了变化:

哈希算法详解图解,哈希算法最简单的解释(4)

首页 123下一页

栏目热文

小红帽安妮绝版了吗(小红帽安妮皮肤现在还能不能买)

小红帽安妮绝版了吗(小红帽安妮皮肤现在还能不能买)

很久没发手游的内容了,刚好7月16日正式公测,这次更新的内容大概看了一眼还是挺有意思的。我这里写的内容还是以活动和福利为...

2022-11-18 03:35:51查看全文 >>

安妮十周年皮肤好不好(安妮十周年皮肤价格)

安妮十周年皮肤好不好(安妮十周年皮肤价格)

小伙伴们大家好,我是小数点。正所谓不鸣则已一鸣惊人,当大家还在惊讶于LOL这游戏走到十周年这个坎怎么还没啥动静的时候,1...

2022-11-18 03:23:19查看全文 >>

十周年安妮皮肤稀有吗(安妮十周年皮肤错过了)

十周年安妮皮肤稀有吗(安妮十周年皮肤错过了)

​LOL十周年最强福利并不是第11天领的10周年限定安妮皮肤,而是第十天领的随机传说皮肤,为什么这么说?十周年限定安妮皮...

2022-11-18 03:37:53查看全文 >>

安妮十周年皮肤怎么领取(安妮10周年皮肤为什么领不了)

安妮十周年皮肤怎么领取(安妮10周年皮肤为什么领不了)

《英雄联盟》已正式上线安妮10周年皮肤任务。玩家从今天开始到11月20日期间,登录游戏完成1局系统匹配到的对局,就可以...

2022-11-18 03:10:09查看全文 >>

安妮十周年皮肤打一把就给吗(安妮十周年皮肤值钱吗)

安妮十周年皮肤打一把就给吗(安妮十周年皮肤值钱吗)

安妮的十周年纪念皮肤是LOL全球十周年庆典活动的压轴奖励,只需要10月28日-11月20日期间完成一局游戏,就可以拥有...

2022-11-18 03:27:43查看全文 >>

哈希算法最简单的解释(最简单的哈希算法)

哈希算法最简单的解释(最简单的哈希算法)

什么是Hash算法Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-...

2022-11-18 03:32:23查看全文 >>

哈希算法的数学原理(哈希算法通俗易懂)

哈希算法的数学原理(哈希算法通俗易懂)

本文作者:jeffhe,腾讯 IEG 开发工程师提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块...

2022-11-18 03:32:48查看全文 >>

哈希值怎么计算(哈希值是什么怎么查询)

哈希值怎么计算(哈希值是什么怎么查询)

我们在谈到区块链的时候,经常会听到关于哈希、哈希值、哈希算法这些词。很多人都认为哈希就是区块链上的安全保障,但是严格来说...

2022-11-18 03:24:05查看全文 >>

哈希算法简单举例(哈希算法最简单的解释)

哈希算法简单举例(哈希算法最简单的解释)

文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一...

2022-11-18 03:00:48查看全文 >>

哈希算法最终结果(哈希算法的真实案例)

哈希算法最终结果(哈希算法的真实案例)

哈希算法一直是索引中最为经典的方法,它们能高效地储存与检索数据。但在去年 12 月,Jeff Dean 与 MIT 等研...

2022-11-18 02:56:45查看全文 >>

文档排行