Java-HashMap如何找落点

news2024/11/17 9:30:17

顾名思义,HashMap采用的是哈希方式来找落点,通过数据的某些特征,计算出一个哈希值,然后用哈希值与节点建立映射关系,从而确定这个数据应该在哪个节点上,下图是一个具有16个节点的分布式集群,本文后续所有示例均以下图为前提
在这里插入图片描述

假设有一个对象A,它的哈希值是312,那么对象A应该落到8那个节点上,因为312%16=8,同理:
如果对象A的哈希值=15,那么A在15节点上,因为15 % 16=15
如果对象A的哈希值=16,那么A在0节点上,因为16 % 16=0
如果对象A的哈希值=19960312,那么A应该在8那个节点上,因为19960312 % 16=8

通过上述除法的方式,给定一个任意值,用该值除以16,求余数,这个余数必定小于16,从而对任意值进行落点(落到指定的节点)

那么是不是可以有这样一种设想:“假设我有一个算法,给定任意一个数字,代入该算法,如果结果必定小于16”,那么我就可以说该算法可以用来求数据落点? 没错,这种设想是一个真命题,是正确的,在Java中,Joshua Bloch使用了下面的方式实现了该算法,该算法共分下面几个步骤:

步骤1).假设对象A的哈希值=312(一定要记住这个数字,因为是我们HR的生日,植树节那天)

步骤2).用312 & 15 = 8
|----为什么要与15,与16不行吗?不行,因为节点最多16个,15的2进制是1111,能确保任何数&15之后结果必定0到15,与16结果有可能得出16
|----为什么要与操作,或操作不行吗?不太行,这个算法中的与操作就是为了分割位数,保留后多少位,或的话根本不沾边,根本不能保证结果<=15
|----既然得出了8,那把A放到8号节点了是不是就可以了?不行,算法截至到目前,还不完善,因为&15,就意味着任何哈希值,都截取最低4位再15,假设2个hash值的低四位相同,那么必定hash冲突,最终落到同一个点,例如504和312,二进制分别如下:

hash值二进制
5041 1111 1000
3121 0011 1000

他俩低4位都是1000,与15之后,将产生相同的结果,因为高4位没参与计算,导致落点位置相同,冲突的概率很大

步骤3).如何才能使高位也参与计算呢?方法万千,只要让高4位参与计算就可以了,至于什么计算无所谓(与或非啥的都行),下面我们使用了右移4位的方式让高位参与计算
504:
原值为:1 1111 1000
右移四:0 0001 1111
这俩值再 & 一下结果为:0 0001 1000
该结果低四位再 & 15=1000&1111=十进制8(落到8号点)
312:
原值为:1 0011 1000
右移四:0 0001 0011
这俩值再 & 一下结果为:0 0001 0000
该结果低四位再 & 15=0000&1111=十进制0(落到0号点)

这个时候我们发现通过右移4为之后再&自身,最终低4位的结果就不一样了,这样,低4位再&步骤3的15,就减少了hash冲突

总结:
1. 在Java的HashMap源码中,步骤3对应的就是static final int hash方法,不过该方法右移16位,本示例右移4位
2. 求落点的方式,传统上用求余的方式,而在Java的HashMap中,使用的是&[数组长度-1]的方式,也就是本文的步骤2,对应HashMap源码是getNode方法中的tab[(n - 1) & hash])这段代码
3. 右移N位与本算法的关系:假设有2个hash值,它们都小于2的N次方,那么本算法不能解决hash冲突,在本文的步骤3中,N=4,那么2的4次方=16,如果两个hash值都小于16,那么通过右移再与自身,然后&15,得到的落点是一样的,例如14和13
14=(14 & (14>>>4))& 15=落点为0
13=(13 & (13>>>4))& 15=落点为0
但是如果大于16,则大概率落点不一样,例如17和18
17=(14 & (14>>>4))& 15=落点为1
18=(13 & (13>>>4))& 15=落点为0
4. HashMap中为什么没有采用传统的求余找落点的方式,而是采用这种方式?在注释中它也提及了,是为了提高效率(xor指令使用方式),所以在解决hash冲突的质量上进行了一定的降低,言外之意就是这种方式没有求余的方式落点质量高,这点从总结3中就能看得出来,需要hash值的范围做配合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM篇--垃圾回收器高频面试题

1 你知道哪几种垃圾收集器&#xff0c;各自的优缺点是啥&#xff0c;重点讲下cms和G1&#xff0c;包括原理&#xff0c;流程&#xff0c;优缺点&#xff1f; 1&#xff09;首先简单介绍下 有以下这些垃圾回收器 Serial收集器&#xff1a; 单线程的收集器&#xff0c;收集垃圾时…

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别&#xff1a; 二、实验 1、安装部署 2、给集群添加监控&#xff1a; 3、创建命名空间&#xff1a; 4、创建deployment&#xff1a; 5、创建service&#xff1a; 6、创建ingress&#xff1a; 7、创建hpa 8…

redis—Set集合

目录 前言 1.常见命令 2.使用场景 前言 集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中1)元素之间是无序的2)元素不允许重复&#xff0c;如图2-24所示。一个集合中最多可以存储22 - 1个元素。Redis 除了支持集合内的增删查改操…

Android SeekBar 进度条圆角

先看下效果图&#xff1a; 之前&#xff1a; 优化后&#xff1a; 之前的不是圆角是clip切割导致的 全代码&#xff1a; <SeekBarandroid:layout_width"188dp"android:layout_height"wrap_content"android:background"null"android:focusa…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman&#xff0c;1983年9月推出GNU项目&#xff0c;并发起自由软件运动(free software movement或free/open…

【并发】什么是 Future?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 关键特性和操作包括&#xff1a; 提交任务&#xff1a; 查询完成状态&#xff1a; 等待结果&#xff1a; 取消任务&#xff1a…

Vue实现图片预览,侧边栏懒加载,不用任何插件,简单好用

实现样式 需求 实现PDF上传预览&#xff0c;并且不能下载 第一次实现&#xff1a;用vue-pdf&#xff0c;将上传的文件用base64传给前端展示 问题&#xff1a; 水印第一次加载有后面又没有了。当上传大的pdf文件后&#xff0c;前端获取和渲染又长又慢&#xff0c;甚至不能用 修…

Windows下网络编程(win32API+VS2022)

一、开发环境 我这里介绍下我用的环境安装过程。 所有版本的VS都可以的。 我当前环境是在Windows下&#xff0c;IDE用的是地表最强IDE VS2022。 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ 因为我这里只需要用到C和C语言编程&#xff0c;那…

SRC实战 | 小白SRC找到的第一个SQL注入

本文由掌控安全学院 - zbs投稿 一、漏洞说明 xxxxx公司后台存在SQL注入&#xff0c;后端数据库为Mysql 【显错位2&#xff0c;4&#xff0c;6】 漏洞已提交平台&#xff0c;后台的开发商提供给了很多公司&#xff0c;搜一下资产就有很多公司都没有修复该漏洞。 二、漏洞挖掘…

Java Web(四)--JavaScript

介绍 JavaScript 教程 JavaScript 能改变 HTML 内容&#xff0c;能改变 HTML 属性&#xff0c;能改变 HTML 样式 (CSS)&#xff0c;能完成页面的数据验证&#xff1b; JS 需要运行浏览器来解析执行JavaScript 代码&#xff1b; JS 是 Netscape 网景公司的产品&#xf…

Git搭建

文件格式 <VirtuaHost * 80> nginx </virtualHost> pache xml server {} nginx conf格式 [xx] 配置内容 代码开发中版本控制,项目代码编译构建,项目版本迭代全流程 命令300条 Hospital Information System 开发语言分类: 编译型: C nginx ma…

SSL证书 DV、OV、EV等级的证书适用群体

DV&#xff08;Domain Validation&#xff0c;域名验证&#xff09;证书 特点&#xff1a;DV证书是最基础的SSL/TLS证书类型&#xff0c;仅验证申请证书的实体是否对该域名有控制权。验证过程相对简单快速&#xff0c;通常只需要验证域名的所有权即可。 适用人群&#xff1a;…

蓝桥杯备战——2.矩阵键盘

1.分析原理图 由上图可以看到若J5跳线帽接地&#xff0c;就S4~S7就可以当做四路独立按键&#xff0c;若接到P44&#xff0c;则就是4*4的矩阵键盘。 2.独立按键处理 相对传统的按键延时消抖方案&#xff0c;这里我采用更高效&#xff0c;更经典&#xff0c;更偏向产品级应用的…

2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 低分辨率下看世界 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#xff0c…

一文读懂mysql的锁

提起mysql的锁&#xff0c;你是否会似懂非懂&#xff0c;最常听人提起的就是乐观锁&#xff0c;悲观锁、排他锁、共享锁 悲观锁是用 select c form T for update然后等待提交实现的&#xff0c;但是你知道吗&#xff0c;其实排他锁和悲观锁其实是一回事&#xff01;&#xff0…

vue常用指令(v-if)

一、v-if 指令 作用: 根据表达值的真假,切换元素的显示和隐藏( 操纵dom 元素 ) 二、代码演示 1、v-if 设置条件&#xff0c;添加按键修改状态 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta na…

12. banner 定制

1. 简介 Spring Boot 启动时默认会显示以下 LOGO&#xff1a; . ____ _ __ _ _ /\ / ’ __ _ () __ __ _ \ \ \ ( ( )__ | _ | | | ’ / | \ \ \ \/ )| |)| | | | | || (| | ) ) ) ) ’ || .__|| ||| |_, | / / / / |||///// :: Spring Boot :: (v2.1.1.RELEASE) 实际上&am…

沃通服务器密码机(WTHSM)

概述 沃通服务器密码机&#xff08;WTHSM&#xff09;由沃通CA自主设计开发&#xff0c;严格遵照国密局颁布技术规范&#xff0c;获得国密局颁发《商用密码产品认证证书》&#xff0c;是一款多安全功能、高稳定性、可扩展和快速部署的软硬件集成化安全设备&#xff0c;为应用提…

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

手上 ROC-RK3399-PC Pro 使用蓝牙 WIFI 模组是 AP6256。 一、AP6256 模组介绍 AP6256是正基科技(AMPAK)推出的一款低成本、低功耗的双模模块,它集成了Wi-Fi和蓝牙功能。这款模块支持SDIO接口,具有以下特点: 1、型号:AP6256 2、接口:SDIO(Secure Digital Input/Outp…

MySQL--数据类型(4)

MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL …