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

谈谈我所了解的hash

谈谈我所了解的hash?

    • Hash索引
      • 原理
      • 优点
      • 缺点
      • 适用场景
    • HashMap中的hash算法
    • redis中的hash
      • 压缩列表(ziplist)
      • 哈希表(hashtable)
    • 一致性Hash
      • 原理
      • 特点
      • 应用场景

Hash索引

Hash索引基于哈希表这种数据结构来实现快速数据查找。

原理

在使用Hash索引时,数据库会对索引列的值进行哈希函数运算,得到一个哈希码,然后根据这个哈希码将数据存储在对应的哈希桶(存储位置)中。当进行查询时,数据库会对查询条件中的值进行同样的哈希函数运算,得到哈希码后直接到对应的哈希桶中查找数据。

优点

  • 查找速度快:Hash索引的查找时间复杂度通常为O(1),这意味着无论数据量有多大,查询操作的时间基本保持不变。在处理等值查询(如WHERE column = value)时,Hash索引能够迅速定位到数据所在的位置,查询效率非常高。
  • 结构简单:Hash索引的实现相对简单,基于哈希表的数据结构,不需要像B+树索引那样进行复杂的树结构操作,因此在插入、删除和修改数据时,维护索引的开销相对较小。

缺点

  • 不支持范围查询:Hash索引只能处理等值查询,对于范围查询(如WHERE column > valueWHERE column BETWEEN value1 AND value2),Hash索引无法直接使用。因为哈希函数将数据分散存储在不同的哈希桶中,无法根据哈希值的大小来确定数据的范围。
  • 哈希冲突问题:当不同的索引列值经过哈希函数计算后得到相同的哈希码时,就会发生哈希冲突。数据库需要额外的处理机制来解决哈希冲突,如链表法(将冲突的数据存储在同一个哈希桶的链表中)或开放寻址法(寻找下一个可用的存储位置),这会增加查询和维护的复杂度。
  • 排序性能差:由于Hash索引是基于哈希值来存储数据的,数据在物理存储上是无序的,因此无法利用Hash索引进行排序操作。如果需要对数据进行排序,数据库需要进行额外的排序操作,这会增加查询的时间开销。

适用场景

  • 等值查询频繁的场景:如果应用程序中大部分查询都是基于等值条件进行的,如根据用户ID、订单ID等进行查询,那么使用Hash索引可以显著提高查询性能。
  • 数据仓库中的维度表:在数据仓库中,维度表通常包含大量的静态数据,并且经常进行等值查询。为维度表的关键列创建Hash索引可以加快查询速度,提高数据分析的效率。

HashMap中的hash算法

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
  • hash算法说明:h ^ (h >>> 16):对 h 和 h >>> 16 进行按位异或(^)操作。按位异或操作的规则是相同位为 0,不同位为 1。通过这种方式,能让 h 的高 16 位和低 16 位进行混合,从而使哈希值的分布更加均匀。

redis中的hash

Redis中Hash的底层实现主要有两种数据结构:压缩列表(ziplist)和哈希表(hashtable)。Redis会根据实际情况自动选择合适的底层数据结构来存储Hash数据。

压缩列表(ziplist)

  • 结构特点:压缩列表是一种紧凑的、以字节为单位的顺序存储结构,它可以包含多个节点,每个节点可以存储一个字节数组或者一个整数值。节点之间紧密相连,没有多余的空间浪费。
  • 使用场景:当Hash对象包含的键值对数量较少,且每个键和值的长度都较短时,Redis会使用压缩列表作为Hash的底层实现。例如,一个Hash对象只包含几个字段,如 {"name":"John","age":"30","city":"New York"},这种情况下使用压缩列表可以高效地利用内存空间。
  • 优势:压缩列表的内存占用小,在存储少量数据时具有很高的空间效率。它可以将多个键值对连续存储在一段内存空间中,减少了内存碎片的产生。同时,由于数据紧凑存储,在遍历Hash对象时也能提高访问速度。
  • 劣势:当向压缩列表中插入或删除元素时,可能会导致大量节点的移动,从而影响性能。因为压缩列表是顺序存储结构,插入或删除操作可能需要对后续节点进行重新排列。

哈希表(hashtable)

  • 结构特点:哈希表由数组和链表组成。数组中的每个元素称为桶(bucket),每个桶可以存储一个键值对。当有新的键值对要插入时,会根据键的哈希值计算出在数组中的索引位置,然后将键值对存储在对应的桶中。如果多个键值对的哈希值相同,即发生哈希冲突,那么这些键值对会以链表的形式存储在同一个桶中。
  • 使用场景:当Hash对象包含的键值对数量较多,或者键和值的长度较长时,Redis会使用哈希表作为Hash的底层实现。例如,一个Hash对象包含大量的用户信息,每个用户的信息可能包含多个字段,如姓名、年龄、地址、联系方式等,这种情况下使用哈希表可以提供更高效的读写性能。
  • 优势:哈希表的读写操作平均时间复杂度为 O ( 1 ) O(1) O(1),在处理大量数据时具有很高的性能。它可以快速地根据键的哈希值定位到对应的桶,然后在桶中进行查找、插入和删除操作。即使发生哈希冲突,在链表长度较短的情况下,查找效率也不会受到太大影响。
  • 劣势:哈希表需要额外的空间来存储哈希桶和链表节点,因此在存储少量数据时,空间利用率可能不如压缩列表。同时,当哈希冲突严重时,链表长度会增加,导致查找性能下降。为了解决这个问题,Redis会在适当的时候对哈希表进行扩展和收缩,以保持哈希表的性能。

一致性Hash

一致性哈希是一种分布式系统中用于数据分布和负载均衡的算法。它具有数据分布均匀、节点增减时数据迁移量小等优点,在分布式缓存、分布式数据库等领域有广泛应用。以下是其原理、特点和应用场景的详细介绍:

原理

  • 哈希空间:一致性哈希将整个哈希值空间组织成一个虚拟的圆环,称为哈希环。这个哈希环的范围是从0到 2 32 − 1 2^{32}-1 2321,哈希值按照顺时针方向分布在这个环上。
  • 节点映射:将分布式系统中的各个节点通过哈希函数映射到哈希环上。例如,对于节点A、B、C,通过计算它们的哈希值,将它们分别放置在哈希环上的不同位置。
  • 数据映射:对于要存储或访问的数据,也通过相同的哈希函数计算其哈希值,然后将数据映射到哈希环上。数据会被存储在顺时针方向上第一个大于等于该数据哈希值的节点上。例如,数据D的哈希值在节点A和B之间,那么数据D就会被存储在节点B上。

特点

  • 数据分布均匀:在理想情况下,一致性哈希能够将数据均匀地分布在各个节点上,避免了数据倾斜问题,使得每个节点的负载相对均衡。
  • 节点动态性:当分布式系统中增加或减少节点时,一致性哈希能够尽可能地减少数据的迁移量。新增节点时,只有该节点哈希值附近的一小部分数据需要迁移到新节点;删除节点时,该节点上的数据会被重新分配到其相邻节点,而其他节点上的数据不受影响。
  • 容错性好:如果某个节点出现故障,数据可以自动迁移到其他节点上,不会影响整个系统的正常运行。因为数据是根据哈希值在环上的位置进行分配的,所以即使某个节点不可用,也可以通过顺时针查找下一个可用节点来获取数据。

应用场景

  • 分布式缓存系统:如Memcached、Redis Cluster等。在这些系统中,一致性哈希用于将缓存数据分布在多个节点上,当节点数量发生变化时,能够最小化缓存数据的迁移,提高缓存系统的稳定性和性能。
  • 分布式数据库:在分布式数据库系统中,一致性哈希可以用于数据的分片存储,将数据均匀地分布在多个数据库节点上,实现负载均衡和高可用性。当有新的节点加入或现有节点出现故障时,能够自动调整数据的分布,保证系统的正常运行。
  • 内容分发网络(CDN):CDN用于缓存和分发内容,如图片、视频等。一致性哈希可以将用户的请求映射到离用户最近的缓存节点上,同时在节点状态发生变化时,能够快速调整内容的分布,提高内容的分发效率和用户体验。

相关文章:

  • 哑铃图:让数据对比一目了然【Dumbbell Chart】
  • Java【多线程】(7)常见的锁策略
  • 【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo
  • (蓝桥杯)动态规划蓝桥杯竞赛指南:动态规划解决最少钞票数问题(超详细解析+代码实现)
  • LabVIEW 开发如何降本增效
  • 数据库分表算法详解:原理、实现与最佳实践
  • FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习
  • FogFL: Fog-Assisted Federated Learning for Resource-Constrained IoT Devices
  • 车载联网终端4G汽车TBOX介绍定义与概述
  • Oracle迁移翻车,数据校验没做好...
  • 前端工具方法整理
  • Redis持久化之AOF
  • 百度的deepseek与硅基模型的差距。
  • 原理图输出网表及调入
  • 无耳 Solon AI v3.1.2 发布(兼容 Java 8 ~ 24),支持 SpringBoot2,jFinal,Vert.X 等第三方框架
  • 电池分选机:新能源时代的品质守护者|深圳比斯特自动化
  • 若依原理笔记
  • 8-运算符
  • Ubuntu16.04配置远程连接
  • java基础 数组Array的介绍
  • 中国常用网站/山东最新消息今天
  • java做网站浏览记录/搜索引擎优化的常用方法
  • 辽宁建设工程信息网企业人员调动/潍坊seo计费
  • 海外网站推广/要做网络推广
  • 网站建设哪家有/市场调研分析报告模板
  • 一个简单的网站怎么做/产品推广策划方案