当前位置:首页 > 数码 > 哈希表底层算法与哈希值计算方法的对比与选择 (哈希表的底层数据结构)

哈希表底层算法与哈希值计算方法的对比与选择 (哈希表的底层数据结构)

admin4个月前 (04-28)数码27

哈希表是一种常用的数据结构,用于高效地存储和查找数据。在哈希表中,每个元素都有一个对应的键和值,通过计算键的哈希值,将其映射到数组的特定位置上。哈希值的计算是哈希表的关键步骤之一,它决定了元素在数组中的存储位置。

哈希函数

在哈希表底层,常用的算法用于计算哈希值的是散列函数(HashFunction)。散列函数是一种将输入数据映射到固定大小的输出值的函数。它的设计目标是尽可能均匀地将输入值分散到输出范围内的不同位置,以减少冲突的概率。在哈希表中,散列函数负责将键映射到数组的索引位置,使得元素能够均匀地分布在整个数组中。

常见的哈希表底层算法

  • 直接寻址法(DirectAddressing):直接使用键作为数组的索引,将键值对存储在数组中对应的位置上。这种方法在键的范围较小且连续的情况下效果较好,但对于范围较大或不连续的键,会造成空间浪费。
  • 除留余数法(DivisionMethod):将键除以一个固定的数,并取余数作为哈希值。这种方法简单快速,但在键的分布不均匀时容易导致冲突。
  • 平方取中法(Mid-squareMethod):将键的平方数进行截取,取中间的一部分作为哈希值。这种方法可以较好地处理键的分布不均匀的情况,但计算开销较大。
  • 乘法散列法(MultiplicativeHashing):将键乘以一个介于0和1之间的常数,并取结果的小数部分乘以数组长度,再取整数部分作为哈希值。这种方法能够较好地处理键的分布不均匀,且计算开销较小。

其他哈希值计算算法

除了上述常用的哈希表底层算法,还有一些其他的算法可以用于计算哈希值,如:

  • MD5(MessageDigestAlgorithm5):MD5是一种广泛使用的哈希函数,能够将任意长度的输入数据映射为固定长度的哈希值。它具有较高的散列性和抗碰撞能力,但由于其较短的输出长度(128位),可能存在哈希冲突的概率较高。
  • SHA-1(SecureHashAlgorithm1):SHA-1是一种安全哈希函数,能够将任意长度的输入数据映射为160位的哈希值。它具有较高的散列性和抗碰撞能力,但由于其输出长度较长,计算开销较大。
  • 哈希表的底层数据结构
  • CRC32(CyclicRedundancyCheck):CRC32是一种循环冗余校验码,常用于数据校验和错误检测。它能够将输入数据映射为32位的哈希值,具有较高的散列性,但抗碰撞能力较弱。

算法选择

哈希表底层采用的算法用于计算哈希值的选择取决于具体的需求和应用场景。不同的算法具有不同的特点和性能表现,开发者需要根据实际情况选择合适的算法,以保证哈希表的性能和效率。


HashMap底层实现原理解析

我们常见的有集合数据有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点:

而我们常见的HashMap就是这样的一种数据结构

(1)、首先将k,v封装到Node对象当中(节点)。 (2)、然后它的底层会调用K的hashCode()方法得出hash值。 (3)、通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。

(1)、先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。 (2)、通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着参数K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。

原因 : 增删是在链表上完成的,而查询只需扫描部分,则效率高。

HashMap集合的key,会先后调用两个方法,hashCode and equals方法,这这两个方法都需要重写。

因为equals方法默认比较的是两个对象的内存地址

哈希值是什么?

哈希值一般指哈希函数。

哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。

一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。

理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。

哈希值概念简单普及:

1、哈希值其实就是一段数据,只不过这个数据有特殊的含义,它是某个文件或者某个字符串的DNA,或者身份证。

2、哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。

它有这样一个特点,他是唯一的,一旦数据发生了变化,哪怕是一个微小的变化,它的哈希值也会发生变化。另外一方面,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。

3、它常常用来判断两个文件是否相同。比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同,则表示两个文件完全一致,下载过程没有损坏文件。

而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 算法

“哈希表底层算法与哈希值计算方法的对比与选择 (哈希表的底层数据结构)” 的相关文章

从非负数据中揭示隐藏主题和特征-非负矩阵分解算法 (非负数值类型什么意思)

从非负数据中揭示隐藏主题和特征-非负矩阵分解算法 (非负数值类型什么意思)

原理 非负矩阵分解算法(NMF)是一种用于分析非负数据的算法。它将一个非负输入矩阵分解为两个非负矩阵的乘积。 应用场景 文本挖掘 图像处理 社交网络...

优化仿射变换模块算法以优化图像处置成果 (仿射变换模型)

优化仿射变换模块算法以优化图像处置成果 (仿射变换模型)

在计算机视觉畛域,图像处置是至关关键的一局部。但是,处置图像的环节中往往会遇到一些疑问,如图像变形、失真等。这些疑问关键是因为仿射变换模块的算法不够优化所造成的。那么,如何优化仿射变换模块的算法以...

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

最近不时在刷算法题,刷华为OD算法题,有诸多好处: 宿愿用我自己疯狂刷题的劲头,感化大家,让大家爱上刷题,顺利经过华为OD机试,把握更多低劣的算法。 上方这道题,是很经典的深度优先搜查...

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

引言 随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本文将探讨面向推荐系统的深...

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

引言 随着数据的快速增长和跨领域应用的需求,如何利用已有的知识和数据来解决新领域的问题成为了一个重要的研究方向。迁移学习作为一种有效的机器学习方法,可以通过利用源领域的知识和数据来改善目标领...

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

数据模型:业务模型与算法模型的全面解析 导言 数据的世界离不开模型,但"模型"一词的使用往往令人困惑。从营销中的 4P 模型到机器学习中的 K-means 聚类,它们都被称为模型。那么,这些模型...

程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

当编写程序时,了解和经常使用不同的算法对处置疑问至关关键。以下是C#中罕用的10种算法,每个算法都随同着示例代码和详细说明。 1.冒泡排序(BubbleSort): 冒泡排序...

时序分析中的常用算法-都在这里了 (时序分析的特点)

时序分析中的常用算法-都在这里了 (时序分析的特点)

简介 时序分析是一种预测建模技术,它利用历史数据中事件的时间特征来预测未来事件的特征。它不同于回归分析,因为时序分析依赖于事件发生的顺序。 时序分析类型 时序分析分为两类: 静态时序分...