关于哈希,分布式哈希表,一致性哈希
首先来复习一下哈希的意思。
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。
也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。因为散列值小于输入空间,所以也需要一定的解决冲突的算法来协调处理。常见的算法如:md5,sha等。
所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的。但也可能不同,这种情况称为“散列碰撞”,这通常是两个不同长度的散列值,刻意计算出相同的输出值。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
这种散列算法就叫做哈希算法。
使用散列函数将键名和键值关联起来的数据结构就叫做哈希表。
一、哈希表
现在我们假设一个场景,来充分切入说明一下。
假设我有一个班级,一次考试后,得到所有学生的分数:
小明: 85
小红: 70
小张: 80
小王: 99
如上图所示,学生姓名经过hash函数处理后,映射到不同的数字上(当然实际上可能会出现冲突的情况,即散列碰撞,那么可以选择更改输入,重新散列获得新的散列值)。
然后我们将学生姓名映射得到的散列值和学生的分数一一映射起来,形成一个table,这便是散列表了。
0:
1: 70
2: 85
3:
4: 99
5: 80
6:
7:
8:
9:
如果我要查询某一个学生的分数,只需要这样:
hash(姓名) = 散列值
table(散列值) = 分数。
比如:hash(小明) = 2, table(2) = 85。
二、分布式哈希表(DHT: Distributed Hash Table)
OK,继续深入考虑,我们将散列表放在一个机器的内存里,当散列表比较小时候,没有问题,但如果这张散列表超过了一台机器的内存时候,
或者当存储在一台机器上时候,这台机器挂掉了,那所有的数据都会消失……
那现在我们又该怎么做呢?
这便需要引入DHT来处理这种情况了,说白了就是将一张哈希表分割在不同的机器上。
首先,将上面所说的散列空间0,1...9想像成一个首尾相衔的环,9之后又重新回到零,假设,这就是十台机器。
这样我们根据散列算法就可以将不同的学生映射到不同的机器上,实现了数据的分布。
三、一致性哈希(consistent hashing)
好了,上面我们使用DHT实现了数据的分布式存储,但再考虑深一层,分布式架构中,节点的故障是不可避免的,当添加和删除某一节点了,会导致大量散列数据失效,需要重新散列。
影响非常大,那我们用什么哈希算法来实现DHT才能尽量的避免这种情况呢,这便说到了一致性哈希。
consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系。
刚刚我们把学生散列到了hash数值空间里,现在我们需要的是,同时将机器也散列在这个hash空间,让学生和机器的散列值同处在一个数值空间。
ok,如上图所示,如果我们将学生和机器同时散列在一个环中,那么假设小张散列后的值为6,我们顺时针寻找,寻找到的第一台机器,则将小张放入其中。
依次类推,则得到:
小王——>机器一
小明——>机器二
小红——>机器三
小张——>机器四
假设我们机器三失效了,那这时候影响到的仅仅是小红,重新散列到机器四中。
而如果重新加入一台新的机器,影响到的也仅仅是旁边的一台机器,这样便解决了添加删除机器时候的震荡问题,这便是一致性hash的大致思想。
转载于:https://www.cnblogs.com/star-star/archive/2013/02/01/2888713.html
关于哈希,分布式哈希表,一致性哈希相关推荐
- 一致 先验分布 后验分布_浅谈Loki分布式架构中的一致性哈希
云原生小白 看到上面蓝色字了么?关注下吧! Loki在分布式部署的模式下,保存Ingester服务的状态主要有3个渠道,分别是etcd.consul和基于gossip协议的memberlist.不管L ...
- 分布式系统设计理论之一致性哈希
分布式系统设计理论之一致性哈希 主要参考和围绕这篇论文讲解:Consistent Hashing 1 问题引入 什么是一致性哈希?为什么要用一致性哈希? 2 一致性哈希算法出现之前的分布式系统设计 例 ...
- 18 哈希算法的应用和一致性哈希
什么是哈希算法 哈希=散列=Hash,所以哈希算法即散列函数. 哈希算法定义:输入任意长度的二进制串,将其映射为固定长度的二进制串,这个映射的规则就是哈希算法.输出的二进制串就是哈希值,也叫散列值. ...
- 哈希运算python实现_一致性哈希算法 python实现
# -*- coding: utf-8 -*- """ 一致性哈希算法 python实现 参考 http://weblogs.java.net/blog/2007/11/ ...
- 【另类见解】一致性哈希就能解决分库分表问题了?
" 开局一问:分库分表行为中,一致性哈希到底用处大不大? 装B脑图 现在是大数据的时代,其中一个体现就是数据量非常庞大.当然大数据的概念绝非是数据量就可以定义的,我自己给大数据下的定义是:无 ...
- 一致性哈希算法在分布式缓存中的应用
一.应用场景 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Redis作为缓存机制.现在我们一共有三台机器可以作为Redis服务器,如 ...
- 【分布式】一致性哈希和哈希槽
当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢? 1. 普通哈希取模法 1.1 直接哈希取模 这是一种最容易想到的方法,使用取模算 ...
- java 一致性hash算法 均衡分发_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?...
本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...
- 面试时遇到一致性哈希算法这样回答会让面试官眼前一亮
[CSDN 编者按]很多人都知道什么是哈希函数,在后端面试和开发中会遇到"一致性哈希",那什么是一致性哈希呢,当面试官问到你又该如何给出漂亮的回答. 作者 | 丁威 责 ...
- @cacheable 服务器 不一致_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?
持续输出原创文章,点击蓝字关注我吧 本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实 ...
最新文章
- 回顾2009,展望2010。
- java 获取java文件路径_Java怎么获取相对路径下所有的.java文件的信息
- 【转】Java finally语句到底是在return之前还是之后执行?
- python多线程读取文件夹下的文件_是否可以使用python多线程从文件夹数读取文件数,并处理这些文件以获得组合结果?...
- 4种必须知道的Android屏幕自适应解决方案
- 新建虚拟机update时出现不能得到锁问题
- 岗位推荐 | 微软AI Research Group招募自然语言处理AI算法研究实习生
- H3C通过端口ID决定端口角色
- 什么是云原生,跟云计算有什么关系?终于有人讲明白了
- mysql中的索引什么意思_索引是什么意思(数据库中的索引是什么)
- 如何通过yum安装mysql数据库_CentOS 7通过yum安装MySQL数据库例子
- 签约!睿铂与泰瑞数创共同助力实景三维中国建设
- 适配器模式的极简概述
- 海量监控视频如何存储?
- 2022年 接口测试高频面试题及答案
- 汽车修理厂计算机管理,最新汽车维修厂管理系统
- 新年新气象,新的一年新的开始,给自己定个小小的目标,以此为证
- 【规划】Motion Planning Approaches 路径规划方法汇总
- 富康路小学毕业郭佳华
- 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)