哈希函数和哈希码

哈希函数和哈希码

典型的哈希函数首先将搜索键转换为称为哈希码的整数值,然后将哈希码压缩为哈希表的索引。 Java 的根类 ObjecthashCode 方法,该方法返回整数哈希码。默认情况下,该方法返回对象的内存地址。 hashCode方法的通用契约如下:

每当重写 equals 方法时,都应该重写 hashCode 方法,以确保两个相等的对象返回相同的哈希码。在程序执行过程中,多次调用hashCode方法会返回相同的整数,前提是对象的数据没有改变。两个不相等的对象可能有相同的哈希码,但是你应该实现 hashCode 方法来避免太多这样的情况。

基本类型的哈希码

对于byteshortintchar类型的搜索键,只需将它们转换为int即可。因此,任何一种类型的两个不同搜索键将具有不同的哈希码。

对于 float 类型的搜索键,使用 Float.floatToIntBits(key) 作为哈希码。请注意,floatToIntBits(float f) 返回一个 int 值,其位表示与浮点数 f 的位表示相同。因此,float类型的两个不同搜索键将具有不同的哈希码。

对于 long 类型的搜索键,简单地将其转换为 int 并不是一个好的选择,因为所有仅前 32 位不同的键将具有相同的哈希码。为了考虑前32位,将64位分成两半,并执行异或运算将两半组合起来。这个过程称为折叠long 键的哈希码是

int hashCode = (int)(key ^ (key >> 32));

注意>>是右移运算符,将位向右移动32位。例如,1010110 >> 2 产生0010101。 ^ 是按位异或运算符。它对二进制操作数的两个相应位进行操作。例如,1010110 ^ 0110111 产生1100001.

对于 double 类型的搜索键,首先使用 Double.doubleToLongBits 方法将其转换为 long 值,然后执行折叠,如下所示:

长位 = Double.doubleToLongBits(key);
int hashCode = (int)(位 ^ (位 >> 32));

字符串的哈希码

搜索键通常是字符串,因此为字符串设计一个好的哈希函数很重要。一种直观的方法是将所有字符的 Unicode 相加作为字符串的哈希码。如果应用程序中的两个搜索键不包含相同的字母,则此方法可能有效,但如果搜索键包含相同的字母,例如 toddot.

,则会产生大量冲突

更好的方法是生成考虑字符位置的哈希码。具体来说,令哈希码为

s0*b(n – 1) + s1*b(n – 2) + c + sn-1

其中 si 是s.charAt(i)。该表达式是某个正 b 的多项式,因此称为 多项式哈希码。使用霍纳规则进行多项式计算(请参阅案例研究:将十六进制转换为十进制),可以按如下方式有效计算哈希码:

(…((s0*b + s1)b + s2)b + … + sn-2)b + sn-1

此计算可能会导致长字符串溢出,但算术溢出在 Java 中被忽略。您应该选择适当的值 b 以尽量减少碰撞。实验表明,b 的最佳选择是 31、33、37、39 和 41。在 String 类中,使用多项式哈希代码覆盖 hashCode,其中 b 为 31.

压缩哈希码

键的哈希码可能是一个超出哈希表索引范围的大整数,因此您需要缩小它以适应索引的范围。假设哈希表的索引在0N-1之间。将整数缩放到 0N-1 之间的最常见方法是使用

h(hashCode) = hashCode % N

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

为了确保索引分布均匀,请选择 N 为大于 2质数

理想情况下,您应该为N选择一个素数。然而,找到一个大的素数是很耗时的。在 java.util.HashMap 的 Java API 实现中,N 设置为 2 次方的值。这种选择是有充分理由的。当N2的幂的值时,

h(hashCode) = hashCode % N

相同

h(hashCode) = hashCode & (N – 1)

与符号&是按位AND运算符。如果两个相应位都是 1,则两个相应位的 AND 会产生 1。例如,假设N = 4hashCode = 1111 % 4 = 3,这与01011 & 00011 = 11相同。 & 运算符的执行速度比 % 运算符快得多。

为了确保散列分布均匀,在java.util.HashMap的实现中,还使用了补充散列函数和主散列函数。该函数定义为:

private static int SupplementalHash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
返回 h ^ (h >>> 7) ^ (h >>> 4);
}

^>>> 是按位异或和无符号右移运算。位运算比乘法、除法和求余运算快得多。您应该尽可能用按位运算替换这些运算。

完整的哈希函数定义为:

h(hashCode) =supplementalHash(hashCode) % N

这与

相同

h(hashCode) =supplementalHash(hashCode) & (N – 1)

因为N2的幂的值。

以上就是哈希函数和哈希码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/509184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 23:50:55
下一篇 2025年11月8日 23:54:54

相关推荐

  • 什么是Sapien(SAPIEN币)?SAPIEN未来展望及价格预测

    目录 什么是Sapien (SAPIEN)?为什么最近应该关注Sapien?Sapien概览主要特点:Sapien项目背景Sapien如何运作?Sapien的融资信息Sapien的代币经济学SAPIEN空投指南SAPIEN 未来展望Sapien价格预测Sapien 2025 年价格预测Sapien …

    2025年12月11日
    000
  • NFT 版税:创作者权益保障新方式

    NFT版税通过智能合约实现创作者在每次交易中自动获得持续收益,利用区块链的透明性与不可篡改性保障其权益。创作者在铸造NFT时设置版税比例和收款地址,平台将其写入智能合约,后续每次转售都自动执行分成。该机制解决了数字内容复制成本低导致的收益不可持续问题,激励创作并促进生态繁荣。尽管面临跨链兼容、标准统…

    2025年12月11日
    000
  • gate.io交易所(虚拟币交易平台) v7.17.1 官方安卓版

    Gate.io,中文名称为芝麻开门,是一款全球知名的综合性虚拟币交易平台。它为用户提供了包括现货、合约、理财在内的多种数字资产交易与管理服务,以其丰富的币种选择、强大的安全性能和流畅的操作体验而受到广大用户的青睐。 将为您提供Gate.io交易所官方安卓版APP的详细下载与安装教程,您可以直接点击本…

    2025年12月11日
    000
  • PHP 嵌套循环实现素数判断与列表

    本教程详细介绍了如何使用 PHP 嵌套循环来查找并列出指定范围内的所有素数。文章从素数的基本概念入手,逐步讲解了使用嵌套循环进行素数判断的逻辑,并重点分析了初学者常犯的错误——状态标志未重置问题。通过提供一个优化后的代码示例,教程展示了如何正确地实现素数筛选,包括利用 break 语句提升效率,旨在…

    2025年12月11日
    000
  • PHP教程:使用嵌套循环高效查找素数

    本文深入探讨了在PHP中使用嵌套循环查找素数的常见问题及解决方案。通过分析初学者常犯的布尔状态标志未重置错误,提供了两种优化方法:一是正确重置状态标志,二是利用计数器与break语句提高效率。教程包含详细代码示例与解析,旨在帮助读者掌握PHP素数检测算法,并理解循环逻辑中的关键细节。 理解素数与素数…

    2025年12月11日 好文分享
    000
  • PHP函数怎样写一个判断是否为质数的函数 PHP函数质数判断的入门编写教程​

    判断一个数是否为质数的核心是检查其是否仅能被1和自身整除,1. 使用基础函数时只需循环到sqrt($number)以减少计算量;2. 优化方法包括排除偶数并利用6k±1的形式跳过非质数;3. 对大数应采用miller-rabin等概率算法结合bcmath扩展提高效率;4. 生成质数数组可结合ispr…

    2025年12月11日
    000
  • PHP函数如何让函数返回一个简单的数组 PHP函数返回数组的基础实现方法​

    php函数返回数组最直接的方式是使用return语句配合数组字面量或变量,可将一组数据打包返回给调用者;2. 提取返回数组中的数据可通过键名/索引访问、foreach遍历或php 7.1+的数组解构实现高效操作;3. 返回类型声明(: array)提升代码可读性、自文档化能力,并在运行时提供错误检测…

    2025年12月11日
    000
  • php中%的作用

    在 PHP中,% 符号表示模运算符,用于计算两数相除的余数。具体用法包括:1. 找出余数;2. 检查质数;3. 循环计数。 PHP 中 % 符号的作用 在 PHP 中,% 符号称为模运算符。它用于计算两数相除的余数。 语法 $result = $dividend % $divisor; 其中: 立即…

    2025年12月10日
    000
  • 什么是Pyth Network(PYTH)币?PYTH工作原理、未来发展及价格预测

    目录 引言:市场数据为何重要Pyth Network是什么PYTH 代币是什么?Pyth Network 的历史Pyth 如何工作?代币经济模型:PYTH 的分配机制Pyth Network 有何独特之处?PYTH代币Pyth 网络生态系统Pyth Network价格预测Pyth Network 2…

    2025年12月10日
    000
  • php 闭包中的内存管理

    闭包中的内存管理需谨慎,避免引用外部变量。若必须捕获,应捕获值而非引用;否则可能导致内存泄漏。 PHP 闭包中的内存管理 介绍 闭包是指在 PHP 函数内部定义的函数。它们提供了一种将代码与创建它们的上下文环境相关联的方法。然而,当闭包引用外部变量时,就引入了内存管理的问题。 立即学习“PHP免费学…

    2025年12月9日
    000
  • PHP 函数扩展的最佳实践?

    PHP 函数扩展的最佳实践 在 PHP 中编写函数扩展时,遵循最佳实践至关重要,以创建健壮、高效和可维护的代码。以下是一些关键的最佳实践,可帮助你实现这些目标: 1. 使用命名空间 为扩展中的类和函数使用命名空间。这有助于避免与其他扩展或用户代码中的同名标识符冲突。 立即学习“PHP免费学习笔记(深…

    2025年12月9日
    000
  • php都有哪些算法

    PHP 中提供的算法包括:排序、搜索、数学、字符串、数据结构、加密和图形。选择算法取决于问题和性能要求,需考虑数据规模、类型、复杂度和实现难度。 PHP中的算法 PHP 是一门强大的编程语言,提供了广泛的算法来解决各种问题。常见的 PHP 算法包括: 排序算法 冒泡排序选择排序快速排序归并排序桶排序…

    2025年12月9日
    000
  • 币安交易平台官方网址推荐 币安交易app官网注册地址

    币安(binance)作为全球知名的数字资产服务平台,凭借其全面的产品矩阵、尖端的技术实力以及严格的风控体系,它不仅是一个单纯的交易撮合平台,更是一个深度融合了交易、理财、投资及行业教育的一站式综合性数字资产生态系统,致力于为用户提供全方位的服务与支持。 一、官方网站与注册通道 1、官方网址: 2、…

    2025年12月9日
    000
  • 黑石买入6200万美元BTC ,机构囤币狂潮

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币HTX交易所: 注册入口: APP下载: 近期,全球知名资产管理机构黑石集团再次展现其强大的资金实力,斥资6200万美元大举买入比特币,这一动作迅速成为市场焦点。机构投资者的持续涌入,不仅为加密市场带…

    2025年12月9日
    000
  • Solana ETF香港上市在即:即时指数基金引爆市场热情

    香港金融市场即将迎来备受瞩目的Solana现货ETF,这一举措预示着投资者将能通过传统证券交易所更便捷地参与到Solana的投资中。此举不仅为Solana生态系统注入了新的活力,也可能引发新一轮的数字资产投资热潮。 一、解读Solana ETF:连接传统与未来的桥梁 1、Solana ETF是一种在…

    2025年12月9日
    000
  • HTX交易所正版应用领取地址.排名前十的.cc

    htx交易所,前身为火币,是全球领先的加密资产服务平台之一。自2013年创立以来,平台以其安全可靠的交易环境、丰富的资产种类和专业的客户服务,赢得了全球数千万用户的信赖。 HTX交易所入口链接: HTX交易所综合介绍 平台历史与实力 HTX交易所拥有超过十年的稳定运营历史,是行业内资历最深、最具影响…

    2025年12月8日
    000
  • htx交易所app官网最新版 htx交易所app官网入口

    HTX交易所(原火币)是全球知名的数字资产交易平台,以安全稳定的系统和丰富的资产选择著称。1.平台采用多重签名冷账户技术保障用户资产安全,并建立风险准备金制度和专业风控系统;2.提供现货交易、合约交易及多样化理财产品,满足不同投资需求。 HTX交易所(原火币)是全球知名的数字资产交易平台。它为用户提…

    2025年12月8日
    000
  • HTX火必交易所安卓新版 v10.56.0 最新官方版入口

    HTX火必交易所(原火币)是一款全球领先的数字资产交易平台,致力于为全球用户提供安全、专业、便捷的虚拟货币交易服务。该平台支持比特币(BTC)、以太坊(ETH)等数百种优质数字资产的交易和投资,并以其银行级的安全风控体系和流畅的操作体验赢得了广大用户的信赖。 本文将为您提供htx火必安卓最新官方版v…

    2025年12月8日
    000
  • HTX火必交易所v10.58.0官方版 HTX火必交易app最新版本

    HTX火必交易所(原火币)是全球领先的数字资产交易平台,致力于为全球用户提供专业、安全、可靠的数字资产交易和管理服务。本文为您带来HTX火必交易app最新版本v10.58.0的官方下载资源,点击本文提供的下载链接即可下载,轻松开启您的数字资产投资之旅。 HTX火必App官方下载 为了保障您的资产安全…

    2025年12月8日
    000
  • 什么是 Wen Lambo Financial(WLFI)?WLFI价格预测2025-2030年

    wen lambo financial (wlfi) 被誉为优质数字资产,提供对区块链领域高增长主题的投资机会。根据目前的市场情绪,wlfi 预测 2025 年的平均价格为 1,513.00 美元,其上涨潜力与整体加密货币趋势和比特币的表现直接相关。短期内,wlfi 走势稳定,但由于交易市场流动性较…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信