当前位置: 首页 > ops >正文

软件工程(六):一致性哈希算法

哈希算法

定义

哈希算法是一种将任意长度的输入(如字符串、文件等)转换为固定长度输出的算法,这个输出称为“哈希值”或“摘要”。

常见的哈希算法

哈希算法哈希位数特点
MD5128位快速,但已不安全
SHA-1160位安全性提高,但已逐渐淘汰
SHA-256256位高安全性,广泛使用
CRC3232位校验常用,速度快但安全性差

应用场景

  • 加密与签名(如MD5/SHA用于密码)
  • 数据去重(快速比较两个文件是否相同)
  • 哈希表中的键查找(如散列存储)
  • 快速分片或定位资源

一致性哈希算法(Consistent Hashing)

背景与问题

分布式系统中,如缓存(Redis/Memcached)、分布式数据库、CDN 中,经常面临这样的问题:

如果我们有 N 台节点,使用普通哈希对 key 取模分配数据:hash(key) % N
当增加或减少节点时,几乎所有 key 的映射都会变化,导致大量缓存失效或数据迁移

核心思想

一致性哈希解决了节点动态增删带来的大规模数据重映射问题。

一致性哈希的原理:

  • 将整个哈希值空间组织成一个圆环(hash ring),如 0 ~ 2³²-1。
  • 把每个节点映射到环上的一个位置(hash(node_id))。
  • 每个数据 key 也通过 hash 映射到环上的某个点(hash(key))。
  • key 被存储在顺时针方向上第一个遇到的节点中。

举例图示

环形空间(哈希环):0↗     ↘节点A    100↑        ↓节点D ←──── key1250

加入/删除节点的影响小

  • 只需迁移与该节点相关的一小部分数据,而不是全部重分布。
  • 极大提高分布式系统的可扩展性与稳定性

虚拟节点(Virtual Node)

为了解决节点分布不均衡的问题,引入虚拟节点机制:

  • 每个真实节点对应多个虚拟节点(如A节点有A#1, A#2, A#3…),均匀分布在环上。
  • key 映射到虚拟节点,再找到对应真实节点。
  • 可以实现更好的负载均衡

对比总结

对比项哈希算法一致性哈希算法
应用目的散列数据,加密、索引、查重等数据分布在分布式节点间
输入输出任意输入 → 固定长度输出key → 节点映射(保持稳定)
可扩展性差(增删节点需重新映射大部分key)高(只影响局部key分布)
是否使用环结构是(哈希值空间形成一个圆环)
是否使用虚拟节点是(提高负载均衡能力)

典型应用场景

应用系统使用场景
分布式缓存(如Redis集群)key 到节点映射,避免大量迁移
CDNURL 映射到缓存服务器
分布式数据库表或记录按 key 分布到多个分片
消息队列系统Topic、Partition 映射
http://www.xdnf.cn/news/7892.html

相关文章:

  • 【Redis】AOF日志的三种写回机制
  • 一文详解并查集:从基础原理到高级应用
  • MAYA 转换为 STP:深度技术解析与全流程实践指南
  • OpenCV CUDA模块特征检测与描述------创建一个 盒式滤波器(Box Filter)函数createBoxFilter()
  • GPU P-State 模式说明
  • MCP入门介绍
  • 【VS2017】cpp 文件字符编码方式转换
  • 进阶知识:理解函数装饰器@wraps()的返回值逻辑 和 闭包的深度解析
  • 力扣热题100, 力扣.167两数之和II 力扣80.删除有序数组中的重复项力扣99.恢复二叉搜索树力扣.110平衡二叉树
  • 【项目管理】项目管理中的”三边、六拍、四没和只谈“
  • 软件是什么?
  • Sentinel原理与SpringBoot整合实战
  • 开发经典的瀑布流
  • c++11特性——可变参数模板及emplace系列接口
  • 【ffmpeg】SPS与PPS的概念
  • BurpSuite Montoya API 详解
  • 基于stm32的空气质量监测系统
  • 2025年二级等保实施全攻略:传统架构与云等保方案深度解析
  • 乘法逆元:费马小定理(利用快速乘法幂)(JAVA)
  • GitHub 趋势日报 (2025年05月20日)
  • 洛谷B3840 [GESP202306 二级] 找素数
  • MySQL--day5--多表查询
  • 第22天-Python ttkbootstrap 界面美化指南
  • 漏洞扫描企业如何助力企业预防安全风险应对网络攻击?
  • GUI实验
  • vue3 threejs 物体发光描边
  • Python人工智能算法 模拟退火算法:原理、实现与应用
  • 项目执行中缺乏问题记录和总结,如何改进?
  • [java]数组
  • 7.数据的预测分析及可视化