为什么@AutoValue注解使用特定的整数1000003来计算哈希码?

2024-03-05

Java 哈希码生成代码在计算中经常使用素数。这样做有充分的理由,如中所述为什么在 hashCode 中使用质数? https://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode和其他地方。

例如,自动值 https://github.com/google/auto/tree/main/value将为给定值类生成以下哈希代码:

@Override
public int hashCode() {
  int h = 1;
  h *= 1000003;
  h ^= this.firstName.hashCode();
  h *= 1000003;
  h ^= this.lastName.hashCode();
  h *= 1000003;
  h ^= this.age;
  return h;
}

AutoValue 使用特定整数的原因是什么1000003而不是其他素数?如果我使用 IntelliJ 创建一个覆盖的hashCode方法,它使用整数31。使用整数背后是否有一些逻辑和数学推理1000003计算哈希码,而不是其他素数?谷歌搜索没有给我任何答案。

很想知道作者在想什么。


根据Google 内部提交 https://github.com/google/auto/discussions/1516#discussioncomment-5907729,选择 1000003 是因为一位前 Google 员工发现它的性能比 31 更好:

使用[另一个人]发现的哈希计算比*31+

当被问及此事时,AutoValue 开发人员 Kevin Bourrillion解释了可能选择该号码的原因 https://github.com/google/auto/discussions/1516#discussioncomment-5907978:

虽然我不记得细节了……这有点像我,以黄金比例的方式移动事物。尽管这可能会支持 898,459 的乘数,所以我想我也认为这对人眼来说应该是一个很好的简单数字。

但是,是的,让它变得更大的想法只是为了更快地吃掉所有这些初始零,并让这些位返回并相互干扰。

他还指出,较大的数字可以减少现实场景中发生哈希冲突的机会:

另外:(使用Integers为简单起见)与List.of(a, b) and List.of(c, d)如果发生碰撞b - d恰好是31次c - a。与更大的乘数相比,想象现实世界中的情况可能会更容易一些。不过,这里没有确切的科学依据。Object.hashCode无论如何,永远不会成为高质量的哈希函数。

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

为什么@AutoValue注解使用特定的整数1000003来计算哈希码? 的相关文章

随机推荐

  • 使用自定义项目模板在组合框中显示所选项目

    我使用此页面中的代码来设计我的组合框的样式 如何在鼠标悬停时设置组合框背景的样式 https stackoverflow com a 5564151 2848002 我更改了默认项目模板 但现在它们不会出现在所选值区域中 在下图中 您可以看
  • 如何从 XML 文件中删除不可见的垃圾字符

    我想读取一些 xml 文件 当我用记事本 写字板 MS Word 或任何浏览器打开这些文件时 它以其原始形式打开 但是当我尝试用 MS DOS 执行它时 会出现一个看不见的字符 如 被看到 我认为 正在创建一个错误 我发现错误 序言中不允许
  • 防止 System.Window.Forms.ComboBox 的自动选择行为 (C#)

    背景 我有一个Forms ComboBox with a DropDownStyle DropDown 我不使用AutoComplete 但我实现了类似的东西 它不仅过滤文本的开头 而且使用正则表达式并显示与输入的文本匹配的所有项目 这很好
  • C++ - 通过指针访问向量元素的安全性

    在我的一个 C 项目中 我使用的是vector持有一堆struct包含简单游戏的许多元素 即 井字游戏 坐标 x vs o ETC IE struct gameMove int x int y int player int order 每次
  • 带微调器的叠加

    我正在尝试创建一个覆盖层 覆盖一个页面 中间有一个微调器 实现这一目标的最简单方法是什么 我只需要担心 IE 8 及以上版本 使用 css3 类 spinner 它更漂亮而且你不需要 gif spinner position absolut
  • Sweet Alert 2 在父框架中打开

    我有一个 iframe 其源是 php 文件 我想做的是让 Sweet Alert 2 在父框架中打开 而不是在 iframe 内部打开 我尝试过改变目标 但没有成功 以下目标选项均无效 swal target window target
  • 使用 Amazon SNS 使用 PHP AWS SDK v2 发送 SMS 消息?

    我继承了一个 PHP 项目 它与 AWS SDK v2 高度集成 目前无法选择使用 v3 我的问题是如何利用 SNS 根据需要向特定号码发送短信 也就是说 我不想在发生操作时向订阅特定主题的一堆电话号码发送大量通知 我想在发生操作时向特定电
  • 基于 SSL 的 Skype CDN

    我曾经测试登录用户是否可以访问 Skype CDN 来确定是否向他们显示 UI 元素 https cdn dev skype com uri skype uri js 但似乎他们的 CDN 突然移动到了这里 破坏了我的代码 http www
  • MySQL 错误代码:1175 在 MySQL Workbench 中更新期间

    我正在尝试更新专栏visited为其赋予值 1 我使用 MySQL 工作台 并在工作台内部的 SQL 编辑器中编写语句 我正在编写以下命令 UPDATE tablename SET columnname 1 它给了我以下错误 您正在使用安全
  • 如果不指定 ,如何将 传递给 IRB?

    Since irb help 用法 irb rb 选项 程序文件 参数 我知道如果我包含一个 我可以将参数传递给 ARGV程序文件 eg irb test rb A B C 其中 test irb 只是 p ARGV 产生 a b c Ma
  • 需要在java中找到最多三个数字[重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 中查找不同数据类型的 3 个数字中的最大值 基本 Java https stackoverflow com questions 4982210 find the max of 3 num
  • 如何从字符串创建关键字符号? [复制]

    这个问题在这里已经有答案了 从字符串创建符号非常简单 intern test gt test 我正在努力创造keywordplist 的符号 寻找类似的东西 XXXX test gt test 注意 intern test 不产生keywo
  • C++ 中的记忆函子包装器

    这是我为函数编写的通用记忆包装器 它利用元组哈希 https stackoverflow com questions 7110301 generic hash for tuples in unordered map unordered se
  • HTTP 请求“...”中发现的 MAC 签名与任何计算出的签名不同

    我在 Postman 中发送以下请求 以从此 URL 的 Azure Blob 存储检索简单的 jpghttps steamo blob core windows net testcontainer dog jpg https steamo
  • 将 iQueryable 转换为 IEnumerable

    我下面的代码有什么问题 即使数据库中存在匹配的记录 它也不会返回任何项目 如果错了 我该如何转换我的IQueryable to IEnumerable public IEnumerable
  • 将 Excel 流附加到 swiftmailer 消息中?

    我正在尝试在 SwiftMailer 消息中附加 Excel 文件 诀窍是 我不想保存 Excel 文件 然后附加它 然后删除它 而是我只想生成 Excel 并将其附加到消息中 该函数允许附加一个OutputByteStream Creat
  • D3:更改轴标签的字体大小

    我想为使用 D3 创建的时间轴标签指定字体大小 我试过以下这个答案 https stackoverflow com a 19681335 5522601 with 这把小提琴 https jsfiddle net speedymcs o16
  • MongoDB - 命令失败,错误代码 13“未经 ***** 授权执行此命令”

    因此 由于某些奇怪的原因 我的用户无权在 krimson 数据库中写入任何内容 数据库连接成功 但授予用户写入数据库的访问权限未按预期工作 完全错误 Caused by com mongodb MongoCommandException C
  • 有人可以提供使用 boost iostreams 查找、读取和写入 >4GB 文件的示例吗

    我读到 boost iostreams 据说支持 64 位半便携式方式访问大文件 他们的常见问题解答提到64 位偏移函数 http www boost org doc libs 1 39 0 libs iostreams doc faq h
  • 为什么@AutoValue注解使用特定的整数1000003来计算哈希码?

    Java 哈希码生成代码在计算中经常使用素数 这样做有充分的理由 如中所述为什么在 hashCode 中使用质数 https stackoverflow com questions 3613102 why use a prime numbe