数据结构与算法——22.哈希算法

这篇文章我们来讲一下哈希表中较为关键的部分——哈希算法

目录

1.哈希算法的介绍

2.hash算法的使用

2.1 Object.hashCode

2.2 String.hashCode

3.关于哈希表及哈希算法的一些思考


1.哈希算法的介绍

问题:什么是哈希算法?哈希算法有哪些?

答:hash算法是一种将任意长度的数据通过一个算法,变成固定长度数据的过程,这个固定长度的数据就是hash值。hash算法可以将任意大小的数据压缩到固定大小的值。常见的hash算法有MD5、SHA1、SHA256、SHA512、CRC32等。其中,MD5和SHA系列算法是最常用的hash算法。这些算法在计算hash值时,都考虑了原始数据的每一个字节,一旦改动原始数据的任何一个字节,所得到的hash值都会有明显的不同。因此,hash算法被广泛应用于数据完整性校验和加密等方面。

简单来说:hash算法是给任意对象,分配一个编号的过程,其中编号是一个有限范围内的数字(如int范围内)

哈希算法有时也被称为摘要算法、散列算法。

2.hash算法的使用

下面看一下hash算法的使用

2.1 Object.hashCode

常用的哈希算法就是Object.hashCode了,如下图所示:

然后看一下每个对象的hash码:

那么对应到我们hash表的程序中就可以这样使用:

这个就没什么好说的了,很基础的东西,但是能体现出Java的思想。

2.2 String.hashCode

上面介绍了Object.hashCode,但是我们不是经常使用它,而是使用另一个hashCode

为什么呢?下面来看一下例子:

如上图所示,s1和s2是两个不一样的对象,因为我s2用了new关键字。但是这两个String类型的对象中存的值是一样的,如果按照Object的hashCode来理解,这两个对象的哈希码是不一样的,因为对象是不一样的,但是它两的实际结果是一样的。

下面看一下String.hashCode里面的哈希码生成方式:

当然,也可以直接看源码:

这些都没啥好说的。

3.关于哈希表及哈希算法的一些思考

问题1:什么是哈希冲突?怎么解决哈希冲突

答:这个问题回答起来比较多,我会单独出一篇文章来解答

问题2:我们的代码里使用了尾插法,如果改成头插法会怎样呢?

答:jdk里面的Hashtable用的就是头插法,1.8以前的HashMap用的是头插法,1.8以后的HashMap用的是尾插法。其实头插尾插并没有什么区别。但是要注意,在多线程的情况下,头插法会出现一种死循环的问题。

问题3:JDK的HashMap中采用了将对象hashCode高低位相互异或的方式减少冲突,怎么理解这个?

答:这个就涉及到底层的数学运算了,数学性很强,要进行演算的,这里就不多说了,记住这个问题就好了。

问题4:我们的HashTable中表格容量是2的n 次方,很多优化都是基于这个前提,能否不用2的n 次方作为表格容量?

答:可以,但是性能会下降。因为我们的很多计算哈希码的算法的优化都是基于数组长度是2的n次方进行优化的,如果不用2的n次方,那么这些优化就做不了。

问题5:JDK的 HashMap在链表长度过长时会转换成红黑树,对此你怎么看

答:我用电脑看。。。。其实这个操作主要是防患于未然,避免有人用恶意的哈希数据来攻击你的服务器,这些值的哈希码会大量冲突,而一旦冲突了,你的服务器的性能就会降低。这时,将链表转换为红黑树就能避免这种情况。一般情况下,链表的长度不会过程,在前面的实验中也可以看到,20万的数据,长度为6的链表只有2个,没有长度为7的,长度为5的也才十几个。基本上只要出现长度超过8的链表,就可以判定这些数据是恶意攻击的数据了。

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

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

相关文章

一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例

一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例 文章目录 一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例一、视觉设计二、交互设计三、Canvas动…

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

NLP的奥秘:用 Python 揭秘人类语言与人工智能的桥梁【6000 字长文含代码示例】

目录 NLP 的核心任务 NLP 的发展历史 NLP 的技术与方法 传统的 NLP 技术与方法 规则基础方法:语言学的智慧 统计学习方法:数据的力量 深度学习方法:人工智能的新浪潮 NLP 的应用领域 Python在 NLP 中的应用 1、NLTK (Natural Langu…

【第十四届蓝桥杯省赛题目】

选择题: 1.设只含根结点的二叉树高度为1,共有62个结点的完全二叉树的高度为? A.4 B.5 C.6 D.7 解析:高度为K的满二叉树 节点数为 2k-1 ,如果K6 最多有63个节点 故答案为6 选C 2.C中,bool类型的变量占用字…

【AAAI2024】点云的自适应邻域提取

论文标题:Point Deformable Network with Enhanced Normal Embedding for Point Cloud Analysis 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/28497 两个创新点:可变邻域法向量提取 一、由固定邻居变为可变的邻域 二、最小二…

PCL-PEG-DCL (ACUPA) 聚己内酯聚乙二醇PSMA 抑制剂

PCL-PEG-DCL (ACUPA) 聚己内酯聚乙二醇PSMA 抑制剂 【中文名称】 聚己内酯聚乙二醇PSMA抑制剂DCL 【英文名称】 PCL-PEG-DCL (ACUPA) 【品 牌】 碳水科技(Tanshtech) 【纯 度】 95%以上 【保 存】 -20 【规 格】 50mg,100mg,500mg,…

2.SG90舵机模块

当我们输出一段脉冲信号的时候就可以调节舵机的角度 我们可以从原理图可以看到舵机的脚在PA6 从芯片手册我们又可以看到PA6对应TIM3_CH1,并且不用开启部分重映像就能使用 新建Servo.c存放PWM初始化 配置PWM void Servo_TIM3_Init(u16 arr,u16 psc) {//开启TIM3的时钟RCC_APB1…

GIS入门,Java不使用任何第三方库实现射线穿越法计算某个点是否与多边形相交,比普通射线法提升了计算性能

前言 在上一章中《GIS入门,Java不使用任何第三方库实现判断一个经纬度点是否在多个经纬度点组成的多边形内,计算某个点是否与多边形相交》,我们使用了一个最简单的算法“射线法”来计算一个点到是否与多边形相交,但是对于多边形非常多的顶点时,计算就会力有不逮。 本章将…

嵌入式工程师如何利用周末提升自己?

提升自己一定要趁早,这是作为中年人的我,对年轻人的忠告。 以前年轻,觉得时间多,总是幻想着,很多人也大器晚成啊,晚点努力也不晚。 前阵子小米汽车火了,雷总说这是他最后一次重大创业&#xff0…

富 格 林:规避虚假暗箱制胜法宝

富 格 林认为,现货黄金是众多黄金产品中交易规则优势较为明显的存在,尤其是进来的行情走势十分强劲,这给予了投资者更充足的做单机会。不过,机会的增加不意味着就一定可以制胜。要知道规避虚假暗箱才是制胜最有效的法宝。富 格 林…

禅道登录/创建版本/编辑版本接口 【禅道版本 18.12/18.11】

登录获取token import requestsurl = "http://192.168.1.234:6060/api.php/v1/tokens" payload = {"account": "jenkins","password": "jenkins123" } headers = {}response = requests.request

轻松上手MYSQL:MYSQL初识(上)

​🌈 个人主页:danci_ 🔥 系列专栏:《MYSQL入门》 💪🏻 制定明确可量化的目标,坚持默默的做事。 轻松上手MYSQL:从零开始构建你的数据库世界 🚀 🚀欢迎来到My…

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量…

轻松上手MYSQL:MYSQL初识(下)

​🌈 个人主页:danci_ 🔥 系列专栏:《MYSQL入门》 💪🏻 制定明确可量化的目标,坚持默默的做事。 轻松上手MYSQL:从零开始构建你的数据库世界 🚀 🚀欢迎来到My…

稀疏数组思想

稀疏数组的处理方法是: 1)记录数组一共有几行几列,有多少个不同的值 2)思想:把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 例如下面原数组对应稀疏数组:

uni-starter的微信登录拿不到登录者的昵称,头像,手机号问题记录

uni-starter的微信登录竟然拿不到登录者的昵称,头像,手机号 获取手机号的方法在另外一篇文章中,需要认证,需要有营业执照 uni.login({"provider": type,"onlyAuthorize": true,// #ifdef APP"univerif…

2024认证杯A题完整论文教学分享

大家好,从昨天肝到现在,终于完成了2024认证杯A题 保暖纤维的保暖能力的完整论文啦。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 13 二.问题分析 14 2.1问题一 14 2.2问题二 14 2.3问题三 14 三、模型…

算法打卡day31

今日任务: 1)435.无重叠区间 2)763.划分字母区间 3)56.合并区间 435.无重叠区间 题目链接:435. 无重叠区间 - 力扣(LeetCode) 给定一个区间的集合,找到需要移除区间的最小数量&…

React中子传父的方式及原理

方式挺多的,先说最常用的通过props进行父子组件的数据传递和修改以及原理 在React中,props不仅用于传递数据,它们也可以传递可以执行的函数,这使得子组件能够间接更新父组件的状态。这种方法强化了React的单向数据流策略&#xf…

【北京迅为】《iTOP-3588开发板系统编程手册》第5章 文件IO缓存

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…