为什么要向 hashCode() 添加一个常量? [复制]

2023-12-20

我是 Java 新手,最近了解了hashCode(). On 关于 Java hashCode() 的维基百科文章 https://en.wikipedia.org/wiki/Java_hashCode(),有以下示例hashCode()方法:

public class Employee {
    int        employeeId;
    String     name;
    Department dept;

    // other methods would be in here

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + employeeId;
        hash = hash * 31 + name.hashCode();
        hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
        return hash;
    }
}

我知道乘以 31 和 13 会减少碰撞的机会,但我不明白为什么hash被初始化为 1 而不是employeeId。最后,这只是将 17*31*13 添加到hashCode(),这不会改变两个 hashCode() 值是否相等。

Bloch 的《Effective Java(第二版)》第 9 条(第 47 和 48 页)中有一个非常相似的例子,但他对这个加法常数的解释对我来说相当神秘。

编辑:此问题被标记为问题的重复项为什么Java的String中的hashCode()使用31作为乘数? https://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier这个问题是不一样的:它问是否有任何理由更喜欢数字 31 而不是公式中的任何其他数字hashCode() of a String。我的问题是为什么在许多例子中hashCode()我在网上发现有一个常量添加到hashCode()所有对象。

事实上,这个例子hashCode() of a String在这里相关,因为在那个例子中没有添加常数。如果在我上面给出的例子中添加 17*31*13 有任何效果,为什么不在计算时添加这样一个常数hashCode() of a String?


当 hashCode 溢出或者是 2 的非幂时,从非零值开始理论上会有所帮助,这会导致更多位是不同的比较值,溢出的值与未溢出的值相比。

小常数不如大常数有效,但可以使用更少的字节并且速度更快。例如。 * 31 更快,但可能不如 * 109 有效。

它所产生的差异取决于您的用例。

注意:即使确保您拥有唯一的 hashCodes,也不能确保在使用该数字选择存储桶后不会发生冲突。

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

为什么要向 hashCode() 添加一个常量? [复制] 的相关文章

随机推荐

  • C# .NET 中 Windows 窗体之间的值

    我有两种形式 一种是主形式 有一个 crystalreportviewer 另一种形式是用户介绍他想要出现在报告中的用户的 ID 问题我希望用户在报告加载信息之前引入ID 因此当用户在报告加载信息之前单击CreateReport按钮时 我创
  • 如何在java中实现自定义http会话?

    我需要用 Java 实现我自己的 HttpSession 版本 我发现很少有信息可以解释如何实现这一壮举 我想我的问题是 无论应用程序服务器的实现如何 如何覆盖现有的 HttpSession 我确实读过一本高质量但相当老的读物 它帮助我实现
  • 为什么在此表达式中用括号替换美元符号 ($) 会导致错误? [复制]

    这个问题在这里已经有答案了 我有这两种表达方式 foldr 0 map uncurry coords 5 7 foldr 0 map uncurry coords 5 7 1 工作打印出结果 但 2 有错误说
  • 是否可以在不修改/压缩提交的情况下将补丁集添加到 Gerrit 审查中

    一个简单的例子 我对 Gerrit 进行了更改 这会破坏 CI 构建或审阅者不满意 然后我用另一个提交修复我的更改 在许多情况下 这是一个小补丁集 我不希望对其进行新的 gerrit 审查 而是希望将其作为原始审查中的新补丁集 我知道这可以
  • 如何创建动态 LINQ 连接扩展方法

    有一个动态库LINQ http en wikipedia org wiki Language Integrated Query扩展方法作为示例发布Visual Studio 2008 http en wikipedia org wiki M
  • ASP.NET 中的类似 WordPress 的插件框架

    我正在开发一个 CMS 我想要一个框架 这样任何人都可以像 WordPress 一样为其添加插件 我找到了很多解决方案 但它们并没有那么有帮助 谁能告诉我一个好的解决办法吗 Thanks 我可能会首先查看托管可扩展性框架 http www
  • 按住鼠标右键移动无边框 Winform,可能使用本机方法

    我有一种情况 我想通过在窗口的客户区域上按住鼠标右键来移动窗口 正如我所说 它的形式是无边界的 我想 本地 移动它 如果可能的话 否则其他答案也可以 我的意思是当你在标题栏上按住鼠标左键时它的行为方式 通过鼠标移动和类似的事情我得到了很多奇
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • Java与指纹识别

    有人用Java实现指纹识别系统吗 例如 它附带了适用于 linux 和 windows 平台的 java api http www griaulebiometrics com page en us manual fingerprint sd
  • 为什么 ObservableCollection 不会在项目更改时更新?

    我注意到ObservableCollection在 WPF 中 仅通过添加或删除列表中的项目来反映 GUI 中的更改 而不是通过编辑它 这意味着我必须编写自定义类 ObservableCollection 这种行为的原因是什么 Thanks
  • 强制“git merge”将所有差异声明为合并冲突

    在 git merge 中 我希望任何差异 即使通常不是合并冲突 也被视为合并冲突 然后 通过 git mergetool 我可以看到并解决每个差异 我尝试在 gitattributes 中指定 merge 但这似乎不起作用 git che
  • mysql float 返回错误值

    我有一个高精度值的表 存储为Float 当我在表中查询该值时 它返回四舍五入到第一位数字的四舍五入值 但是当我运行下面的查询时 我得到了我存储的值 SELECT MY FLOAT COL 1 FROM MY TABLE Mysql 内部发生
  • Botframework 提示对话框直到用户完成

    我正在使用 Microsoft 的 botbuilder 和 LUIS 创建一个 slack 聊天机器人 有办法继续使用吗builder Prompts text 不断询问用户是否还有用户想要输入的信息 例如for or while环形 例
  • 如何更改 Visual Studio 中的默认构建输出目录?

    在 Visual Studio 2010 到 2013 中 默认情况下 例如 当我创建新的控制台应用程序时 新解决方案将其编译的可执行文件输出到Solution name Project name bin Debug 我希望它们输出到Sol
  • 用于查找数字阶乘的递归函数

    我得到的输出为 24 这是 4 的阶乘 但我应该得到 5 阶乘的输出 即 120 include
  • 在 SQL Server 上对 rowversion/timestamp 列建立索引的后果

    与我之前关于没有中间漏洞的序列的问题相关 保证读者可见的数字始终递增 在此输入链接描述 https stackoverflow com questions 16518133 how to prevent interim identity h
  • Assembly.GetExecutingAssembly() 和 typeof(program).Assembly 之间的区别

    有什么区别Assembly GetExecutingAssembly and typeof program Assembly 假设program在执行程序集中 它们应该返回相同的值 然而 typeof program Assembly应该有
  • pyenv: python: 找不到命令

    我想将 Python3 与 pyenv 一起使用 pyenv root Users asari pyenv pyenv versions system 2 7 15 3 6 2 3 6 3 3 6 4 3 6 6 set by Users
  • 命名空间中的 S3 方法未导出

    我正在开发一个R使用 devtools document 进行打包以创建 NAMESPACE 文件 其中几个函数是用于汇总 预测 绘图 打印的 S3 方法 其中通用函数位于base or stats 我按照 Hadley 的建议使用 exp
  • 为什么要向 hashCode() 添加一个常量? [复制]

    这个问题在这里已经有答案了 我是 Java 新手 最近了解了hashCode On 关于 Java hashCode 的维基百科文章 https en wikipedia org wiki Java hashCode 有以下示例hashCo