java入门,哈希函数

news2024/11/26 14:26:07

一、前言

一听到哈希函数这种东西就感觉是数学,增加了人们的印象它很难。其中在数据结构中的HashMap的存储方式就用到了哈希函数,所以它也算是java的基础。看到哈希别惊慌,首先它只不过是个名称,我们理解它是个函数就行,然后它是散列的,那么就看函数的算法是怎样的。它主要的作用是:通过将关键字(key)映射到表中一个位置, 可以直接访问记录, 以提高查找的速率,相比较其他的查找结构,哈希表查找的时间复杂度更低。

二、哈希函数(散列函数)

1、哈希表:

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

那就是可以写成: adrr = f(key) 

就是通过一定的算法通过key可以找到地址。

2、散列函数的几种构造方法:

1. 直接定址法

取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。

2. 数字分析法

假设某公司的员工登记表以员工的手机号作为关键字。手机号一共11位。前3位是接入号,对应不同运营商的子品牌;中间4位表示归属地;最后4位是用户号。不同手机号前7位相同的可能性很大,所以可以选择后4位作为散列地址,或者对后4位反转(1234 -> 4321)、循环右移(1234 -> 4123)、循环左移等等之后作为散列地址。

数字分析法通常适合处理关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干位分布比较均匀,就可以考虑这个方法。

3. 平方取中法

假设关键字是1234、平方之后是1522756、再抽取中间3位227,用作散列地址。平方取中法比较适合于不知道关键字的分布,而位数又不是很大的情况。

4. 折叠法

将关键字从左到右分割成位数相等的几部分,最后一部分位数不够时可以短些,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。

比如关键字是9876543210,散列表表长是3位,将其分为四组,然后叠加求和:987 + 654 + 321 + 0 = 1962,取后3位962作为散列地址。

折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况。

5. 除留余数法

f(key) = key mod p (p≤m),m为散列表长。这种方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。根据经验,若散列表表长为m,通常p为小于或等于表长(最好接近m)的最小质数,可以更好的减小冲突。

此方法为最常用的构造散列函数方法。

6. 随机数法

f(key) = random(key),这里random是随机函数。当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。

实际应用中,应该视不同的情况采用不同的散列函数。如果关键字是英文字符、中文字符、各种各样的符号,都可以转换为某种数字来处理,比如其unicode编码。下面这些因素可以作为选取散列函数的参考:(1)计算散列地址所需的时间;(2)关键字长度;(3)散列表大小;(4)关键字的分布情况;(5)查找记录的频率。


 三、hashcode是什么东西

​1、什么是hashcode
hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂(事实上这个编码是可以由程序员通过继承和接口的实现重写的),可以参考数据结构书籍。而hashtable等结构,就是通过这个哈希实现快速查找键对象。

​两个对象值相同(x.equals(y) == true),不一定相等。

1) 对象相等则hashCode一定相等;

2) hashCode相等对象未必相等。

2.hashcode有什么作用

在Java中,HashCode的作用主要有两个方面:

在哈希表中的应用:哈希表(如HashMap、HashSet等)是基于哈希码实现的数据结构,通过哈希码可以确定对象在哈希表中的位置,从而实现高效的数据访问和查找。当我们使用哈希表来存储对象时,会使用对象的哈希码来计算该对象在哈希表中的存储位置。
对象的标识性:HashCode可以用于判断两个对象是否相等。在Java中,通过equals()方法比较两个对象的内容是否相等,但在某些情况下,如果两个对象的内容相同但是引用不同,equals()方法会返回false。这时可以使用HashCode来辅助判断对象的相等性。一般情况下,如果两个对象的HashCode相等,那么它们的equals()方法也应该返回true。因此,HashCode可以用于快速比较对象的相等性,尤其在使用哈希表、集合和搜索算法时特别有用。
需要注意的是,HashCode并不是对象的唯一标识符,不同对象的HashCode可能相同。因为HashCode是通过对对象的状态计算而来的,不同对象的状态相同,那么它们的HashCode也会相同。但相同HashCode的对象并不一定相等,因为HashCode是有限的,可能存在哈希冲突。

在Java中,为了正确使用HashCode,应该遵循以下规则:

如果两个对象相等(equals()方法返回true),那么它们的HashCode应该相等。
如果两个对象的HashCode相等,它们不一定相等(equals()方法返回true)。这是由于HashCode的有限性和可能的哈希冲突。
在重写equals()方法时,通常也需要重写hashCode()方法,以保证两个相等的对象具有相同的HashCode。
总之,HashCode在Java中是用于快速查找和比较对象的重要概念,它在哈希表和相等性判断中扮演着重要的角色。
 

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

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

相关文章

全球最强长文本大模型,一次可读35万汉字:Baichuan2-192K上线

大模型看书,从来没有这么快过。 国内大模型创业公司,正在技术前沿创造新的记录。 10 月 30 日,百川智能正式发布 Baichuan2-192K 长窗口大模型,将大语言模型(LLM)上下文窗口的长度一举提升到了 192K toke…

计算机体系结构图,冯诺依曼模型(控制器,运算器,指令集,存储器,cache),os(为什么要有os+如何管理举例,系统调用,用户操作接口)

目录 引入 硬件 -- 冯诺依曼模型 背景 早期 -- 硬件化 冯诺依曼结构 存储程序控制原理 核心思想 结构 cpu -- (运算器和控制器) 介绍 控制器 运算器 指令集 存储器 介绍 内部存储器 读写操作 高速缓冲存储器Cache 内存分类 RAM ROM 外部存储器 软件 -- …

Windows ObjectType Hook 之 ParseProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook,比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 ParseProcedure。文章实…

【入门Flink】- 03Flink部署

集群角色 Flik提交作业和执行任务,需要几个关键组件: 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger JobManager:就是Fink集群里的“管事人”,对作业进行中央调度管理;而它获…

2021上半年下午网络工程师试题

2021上半年下午网络工程师试题 试题一(共20分) 阅读以下说明,回答问题1至问题4,将解答填入答题纸对应的解答栏内。 【说明】 某企业网络拓扑图如图1-1所示。该网络可以实现的网络功能有: 1.汇聚层交换机A与交换机B采用VRRP技术组网; 2.…

myabtis流式查询

1、流式查询简介 流式处理在大数据方面应用比较广泛。随着数据的爆发式增长,流式处理的方式也被应用到日常的工具中,如JDK的对于集合处理的Stream流、Redis5.0新增的数据结构Stream专门来处理消息等。 流式查询指的是查询成功后不是返回一个集合而是返回…

景联文科技:高质量数据采集清洗标注服务,助力大语言模型红蓝对抗更加精准高效

红蓝对抗是一种测试和评估大语言模型的方法。通过模拟真实世界测试AI模型的潜在漏洞、偏见和弱点,确保大型语言模型的可靠性和性能。 在红蓝对抗过程中,由主题专家组成的专业团队负责模拟攻击和提供反馈,他们试图诱导AI模型产生不当行为&…

电子商务平台对接电商供应链,不得不说的开放平台电商API接口

B2B电商开放平台的设计需要从以下几面去思考: 开放平台API接口的设计,主要是从功能需求的角度,设计满足业务需求的接口及对应的字段; 平台与商家之间信息的对接,对接的方法有哪些?对接过程中需要可能会遇到…

PaDiM 无监督异常检测和定位-论文和源码阅读

目录 1. 论文 1.1 检测效果 1.2 框架 1.2.1 特征提取embedding extraction 1.2.2 正样本学习Learning of the normality 1.2.3 计算异常图 inference: computation of the anomaly map 2. 源码 2.1 dataset 2.2 model 2.3 提取特征 1. 论文 https://arxiv.org/abs/…

Redis 6.0 新功能

1-支持 ACL 1.1-ACL 简介 官网:https://redis.io/topics/acl Redis ACL 是访问控制列表(Access Control List)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接。 Redis 5 版本之前,Redis 安全规则只有密码控制&#xf…

Python元编程详细教程

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据, 因此你可以在运行时对它进行内审、生成和/或修改”&#xff…

SpringCloud篇---第三篇

系列文章目录 文章目录 系列文章目录一、负载平衡的意义什么?二、什么是Hystrix?它如何实现容错?三、什么是Hystrix断路器?我们需要它吗?一、负载平衡的意义什么? 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多 种计算资源的…

超高真空变温台的真空压力和气氛精密控制解决方案

摘要:针对目前国内外显微镜探针冷热台普遍缺乏真空压力和气氛环境精密控制装置这一问题,本文提出了解决方案。解决方案采用了电动针阀快速调节进气和排气流量的动态平衡法实现0.1~1000Torr范围的真空压力精密控制,采用了气体质量流量计实现多…

配置OpenCV

Open CV中包含很多图像处理的算法,因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV,需要进行手动配置,下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

纠结蓝桥杯参加嵌入式还是单片机组?

纠结蓝桥杯参加嵌入式还是单片机组? 单片机包含于嵌入式,嵌入式不只是单片机。. 你只有浅浅的的单片机基础,只能报单片机了。最近很多小伙伴找我,说想要一些单片机资料,然后我根据自己从业十年经验,熬夜搞了几个通宵…

Selenium安装WebDriver Chrome驱动(含 116/117/118/119/120/)

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本…

1. eulerAngles函数

对线性代数库Eigen3中eulerAngles函数的理解_qingtian11112的博客-CSDN博客作用: 将旋转矩阵转换为欧拉角 Vector3f ea mat.eulerAngles(2, 0, 2); // 等价于 mat AngleAxisf(ea[0], Vector3f::UnitZ())* AngleAxisf(ea[1], Vector3f::UnitX())* AngleAxisf(ea[…

《Pytorch新手入门》第二节-动手搭建神经网络

《Pytorch新手入门》第二节-动手搭建神经网络 一、神经网络介绍二、使用torch.nn搭建神经网络2.1 定义网络2.2 torch.autograd.Variable2.3 损失函数与反向传播2.4 优化器torch.optim 三、实战-实现图像分类(CIFAR-10数据集)3.1 CIFAR-10数据集加载与预处理3.2 定义网络结构3.3…

99/年服务器测评,续费也99一年,真香,值得入手

每个帐号都有开通名额,开通99元一年,配置2核2G 40G 3M(不限流量),续费也是99一年 开通之后就可以直接续费,免除后顾之忧(一年一年的去续费,直接选择5年价格不太对) 地址:https://mur…

成为java高手的八个条件

成为java高手的八个条件 1、扎实的基础 数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不…