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

news2024/11/29 2:48: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.coloradmin.cn/o/1599099.html

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

相关文章

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表…

兔C_Java集:Java 语言简介

文章目录 1. Java简介历史简介问:Oracle 为什么收购 SUN 公司关于三个分支语言特性: 2. JDK 的安装与配置安装的官网链接配置环境变量 3. 第一个Java程序4. 第一个程序解释关于类的定义 5. CLASSPATH命令自动配置CLASSPATH 与 JVM 的关系CLASSPATH 的手动…

OM3 与 OM4:主要区别和实际应用

OM3 和 OM4 都是激光优化的多模光纤,具有 50/125μm 光纤芯,专为满足 ISO 11801 标准而开发。它们在光纤连接器和应用场景上具有相似性,这往往会导致用户之间的混淆。这些光纤主要设计用于数据中心、局域网 (LAN) 和其…

500以内的不入耳运动耳机推荐,首推五大业内顶级优品

不入耳式运动耳机因其独特的佩戴方式和设计,能够在运动过程中保持对周围环境的警觉,避免因音乐沉浸而忽视潜在的安全隐患,同时它们还能有效减少对耳道的压迫,让运动更加舒适自在,接下来,就让我为大家推荐一…

MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。

本篇文章主要讲解MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。通过本篇文章你可以快速掌握brew安装相对应环境的能力。 作者:任聪聪 日期:2024年4月12日 一、brew介绍及安装说明 官网地址:https://b…

分布式数据库Polardb-X架构及特点

PolarDB-X架构 计算节点(Compute Node,CN)是系统的入口,采用无状态设计的sql引擎提供分布式路由和计算,包括SQL解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度,负责分布式事务2PC协调…

VLAN Mapping原理描述

基本原理 路由器收到带Tag的数据报文后,根据配置的VLAN Mapping方式,决定替换外层Tag中的VLAN ID或优先级;然后进入MAC地址学习阶段,根据源MAC地址映射后的VLAN ID刷新MAC地址表项;根据目的MAC映射后VLAN ID查找MAC地…

【电控笔记2.3】速度回路+系统延迟

2.3.1速度回路pi控制器设计 pi伯德图近似设计(不考虑延时理想情况下) Tl:负载转矩 PI控制器的转折频率:Ki/Kp

用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件? 为了测试实际项目中的海豚定时调度从Kafka到HDF…

Django中的定时任务与后台任务队列的实践【第164篇—Django】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中,处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…

隐私保护?还是安全漏洞?邮箱分身双重身份及创建攻略解析!

很多人只知道微信、QQ等应用分身,对于邮箱分身并不是很了解。邮箱分身和他们的不同点在于我们直接在原有邮箱的基础上创立新的虚拟邮箱地址,并且密码一致,在我们需要运营多个社交媒体账号或者管理多个项目的情况下,邮箱分身是一个…

为什么物联网安全性引发了对身份盗窃的担忧?

物联网是连接互联网的设备和传感器的统称,它代表了一个新的技术时代。这种硬件利用了连接性、硬件、小型化、云计算、数据处理、集成等方面的进步,为消费者和企业带来了好处,同样的物联网方面的威胁也是不断的在增加。 物联网是连接互联网的设…

【面试经典 150 | 链表】分隔链表

文章目录 写在前面Tag题目来源解题思路方法一:模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾…

leetcode代码记录(全排列 II

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1…

C++ | Leetcode C++题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestValidParentheses(string s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s[i] () {left;} else {right;}if (left right) {maxlength max(maxlength, 2 * ri…

基于SSM的购物小程序01

4.1系统架构设计 购物系统设计的系统项目的概述设计分析&#xff0c;主要内容有学习平台的具体分析&#xff0c;进行数据库的是设计&#xff0c;数据采用mysql数据库&#xff0c;并且对于系统的设计采用比较人性化的操作设计&#xff0c;对于系统出现的错误信息可以及时做出处…

GEE APP——土壤水分资源管理器

摘要 由于土壤水分含量与地球气候和天气以及干旱、洪水或山体滑坡等现象有关,因此对许多科学和专业用户来说都非常宝贵。遥感技术为连续测量这一变量提供了独特的可能性。特别是在农业领域,对高空间分辨率绘图的需求非常强烈。然而,目前可操作的土壤水分产品只有中粗空间分…

Udio——革命性的AI音乐生成软件

Udio是一款革命性的AI音乐生成软件&#xff0c;由前谷歌DeepMind的顶尖AI研究人员和工程师共同创立&#xff0c;得到著名风险投资公司a16z的支持。它旨在为音乐爱好者和专业人士提供一个全新的音乐创作和分享平台。用户可以通过文本提示来生成音乐&#xff0c;支持广泛的音乐风…

HashMap的扩容看这一篇足够

在Java中&#xff0c;对于HashMap这样的实现&#xff0c;put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程&#xff1a; 计算Hash值&#xff1a; 首先&#xff0c;put方法会接收一个键&#xff08;Key&#xff09;和一个值&#xff0…

第四百六十二回

文章目录 1. 概念介绍2. 实现方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"关于MediaQuery的优化"相关的内容&#xff0c;本章回中将介绍readMore这个三方包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的readMore是一个…