在java中编写哈希函数的最佳实践是什么?

2023-11-29

我想知道在 java 中编写 #hashCode() 方法的最佳实践是什么。 可以找到很好的描述here。有那么好吗?


这是引用自有效的Java第二版,第 9 项:“始终覆盖hashCode当你覆盖equals":

虽然本项中的配方产生了相当好的散列函数,但它并没有产生最先进的散列函数,Java 平台库也没有提供从 1.6 版开始的此类散列函数。编写这样的哈希函数是一个研究课题,最好留给数学家和计算机科学家。 [...尽管如此,]本项中描述的技术对于大多数应用来说应该足够了。

乔什·布洛赫的食谱

  • 将一些常量非零值(例如 17)存储在int变量称为result
  • Compute an int hashcode c for each field f that defines equals:
    • 如果该字段是boolean, 计算(f ? 1 : 0)
    • 如果该字段是byte, char, short, int, 计算(int) f
    • 如果该字段是long, 计算(int) (f ^ (f >>> 32))
    • 如果该字段是float, 计算Float.floatToIntBits(f)
    • 如果该字段是double, 计算Double.doubleToLongBits(f),然后对结果进行哈希处理long如上
    • 如果该字段是一个对象引用并且该类的equals方法通过递归调用来比较字段equals, 递归调用hashCode在场上。如果该字段的值为null,返回0
    • 如果该字段是一个数组,则将其视为每个元素都是一个单独的字段。如果数组字段中的每个元素都很重要,则可以使用其中之一Arrays.hashCode1.5 版本中添加的方法
  • 合并哈希码c into result如下:result = 31 * result + c;

当然,这个配方相当复杂,但幸运的是,您不必每次都重新实现它,这要归功于java.util.Arrays.hashCode(Object[]).

@Override public int hashCode() {
    return Arrays.hashCode(new Object[] {
           myInt,    //auto-boxed
           myDouble, //auto-boxed
           myString,
    });
}

从 Java 7 开始,有一个方便的 varargs 变体java.util.Objects.hash(Object...).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java中编写哈希函数的最佳实践是什么? 的相关文章

  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 无法使用 SQL 创建具有小数位的数字列

    下面的SQL CREATE TABLE TESTTABLE TESTFIELD dec 6 2 抛出错误 SQL0104 令牌 无效 有效令牌 AS NO FOR NOT FILE WITH CCSID CHECK LOGGED UNIQU
  • 格式化sectionNameKeyPath NSFetchedResultsController - Swift

    我正在尝试格式化我的sectionNameKeyPath对于我的核心数据获取 使用存储的NSDate属性 它正在全面工作 并根据以下内容将记录拉动 排序到各个部分NSDate但我不知道如何格式化它以按 dd mm yyyy 显示它 我知道如
  • CSS 动画、自动幻灯片上的淡入淡出不透明度

    我想制作一个幻灯片 其中图片通过淡入淡出不透明度进行过渡 它只是在屏幕上变暗并切换到下一张图片 我让它工作 但添加了其他浏览器 webkit 它停止工作 似乎找不到我的错误 幻灯片仍然有效 这是代码 Fading animation in
  • 我的 Android Studio 从 3.4 更新到 3.5 后不断崩溃

    从今天起我就一直面临这个问题 昨天我将 Android Studio 从 3 4 更新到 3 5 它运行良好 但从今天开始 它在启动时崩溃 当我启动时 它显示启动屏幕 然后尝试加载项目并突然关闭或崩溃 而不显示任何错误消息 我应该怎么办 是
  • Delphi XE4 - 八进制常数像十进制常数一样工作

    今天我正在对我的队友进行代码审查 它是普通的旧 Delphi 版本 XE4 我检测到这样的代码 cWin CountryIdsSet array 0 243 of integer 499 688 040 它是十进制 ID 列表 但其中之一
  • C- 使用位域时结构的大小以及它如何存储在内存中

    void main struct bitfield signed int a 3 unsigned int b 13 unsigned int c 1 struct bitfield bit1 2 14 1 clrscr printf d
  • C++ 子模式匹配

    谁能告诉我一个关于在 C C 中使用正则表达式 regex h 来搜索和 或提取正则表达式中的子模式的示例 在 javascript 中 它会是这样的 var str the string contains 123 dots and 344
  • While 循环,每个其他循环的语句?

    我有一个 while 循环 每个循环显示一个 li li 在列表中 有没有办法告诉 php 每个其他循环都应该回显 li style background 222 li 在我的 CSS 中 我将另一种颜色 111 设置为默认值 以便我的网站
  • 如何使用python通过beautifulsoup中的lxml从网页中提取img src?

    我是 python 新手 正在从事亚马逊的网页抓取项目 我在如何使用 BeautifulSoup 通过 lxml 从产品页面中提取产品 img src 时遇到问题 我尝试使用以下代码来提取它 但它没有显示 img 的 url 这是我的代码
  • eXist-db compression:zip 函数是否添加 XML 声明

    我有一个 XQuery 函数可以将一组 XML 文件转换为 HTML 并压缩它们 它在每个文件上运行一个 transform 来创建 元素 从该函数开始 declare function xport make sources path as
  • Spring:一个类可以同时是@Document和@Table吗

    我在 MVC 上下文中使用 spring 我正在使用 Cassandra 和 MonogDB 对于该项目 我必须使我的模型和 dao 类与这两个数据库兼容 是否可以有相同的模型类 Document并且也可以是 Table spring能在运
  • 全局添加函数到原型(从模块内)

    我想从模块内向 Typescript 1 8 中的数组原型添加一个函数 我正在更改 utils ts 文件中的原型 declare global interface Array
  • 将鼠标悬停在图像上时以受控方式滚动 div 内容

    我有一个高度和宽度有限的 div 其内容超出了 div 的大小 因此 我在 div 的顶部和底部放置了两个图像 并且我希望内容相对于我悬停在其上的图像上下滚动 我已经成功地实现了悬停 但它不受控制 即使我将鼠标移离图像 它也会一直持续到最后
  • 当会话被视为已访问时

    是否打电话HttpServletRequest getSession boolean create 导致会话的最后访问时间被更新 关于什么getId 方法甚至调用getLastaccessedtime 简而言之 访问的标准是什么 HttpS
  • 使用 CUSPARSE 时遇到问题

    当我想编译我的程序 使用 Cusparse 时 出现了以下几行 tmp tmpxft 00001048 00000000 13 matvec o 在函数中main tmpxft 00001048 00000000 1 matvec cuda
  • 如何在 Fortran 中抑制“已删除功能:暂停语句”的警告?

    我用谷歌搜索但找不到答案 我怎样才能抑制这个警告 并且只有这个 警告 删除的功能 1 处的 PAUSE 语句 我知道我可以抑制所有警告 但我只想抑制这一警告 或者如果不可能的话 抑制删除功能的警告 谢谢 A 使用 std legacy 或
  • 运行 Nuget 还原时出现 NU1202 错误

    我有一个 NET Framework 解决方案 正在尝试使用 Azure DevOps 上的管道进行设置 我在尝试恢复包时遇到错误 NU1202 Package AppCenter Analytics Metrics 1 1 0 is no
  • 如何在 Matplotlib 中选择 Y 轴上每个点之间的大小?

    我只是想使用 x 轴列表和 y 轴列表制作一个普通图表 但问题是 我希望能够选择 y 轴的大小 就像点之间的长度一样 我希望自己能够选择 例如 我的 y 轴叙述 0 2 5 5 7 5 等 我想将其更改为0 2 4 6 8 等 那么有没有办
  • Sql Server 2005 上的报告服务 2008

    我可以将 Reporting Services 2008 与 SQL Server 2005 数据库一起使用吗 我是否需要两个许可证 适用于 SQL Server 2008 和 SQL Server 2005 我是否需要两个实例 SQL S
  • 在java中编写哈希函数的最佳实践是什么?

    我想知道在 java 中编写 hashCode 方法的最佳实践是什么 可以找到很好的描述here 有那么好吗 这是引用自有效的Java第二版 第 9 项 始终覆盖hashCode当你覆盖equals 虽然本项中的配方产生了相当好的散列函数