提问人:ARK 提问时间:6/28/2018 最后编辑:M. JustinARK 更新时间:5/16/2023 访问量:214
为什么@AutoValue注解使用特定的整数1000003来计算哈希码?
Why @AutoValue annotation uses the specific integer 1000003 for calculating hash code?
问:
Java 哈希代码生成代码在其计算中通常使用质数。这是有充分理由的,如为什么在hashCode中使用质数?和其他地方所解释的那样。
例如,AutoValue 将为给定的值类生成以下哈希代码:
@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 使用特定整数而不是其他质数的原因是什么?如果我使用 IntelliJ 创建一个重写的方法,它使用 integer .使用整数而不是其他质数来计算哈希码背后是否有一些逻辑和数学推理?谷歌搜索没有给我任何答案。1000003
hashCode
31
1000003
很想知道作者在想什么。
答:
根据 Google 内部提交,之所以选择 1000003,是因为一位前 Google 员工发现它的性能优于 31:
使用 [另一个人] 发现的哈希计算的性能远远优于
*31+
当被问及这个问题时,AutoValue 开发人员 Kevin Bourrillion 解释了可能选择该号码的原因:
虽然我不记得细节了......这有点像我,把事情转移到黄金比例的分数上。虽然这可能会使乘数达到 898,459,但我想我也认为这对人眼来说应该是一个不错的简单数字。
但是,是的,让它变大的想法只是为了更快地吃掉所有这些初始零,并让这些位回来并相互干扰。
他还指出,在实际场景中,较大的数字会降低哈希冲突的几率:
另外:(为简单起见)与,如果碰巧是 31 次,你会得到碰撞。而且,想象现实世界的情况可能比使用更大的乘数要容易一些。不过,这里没有确切的科学。 无论如何,它永远不会完全是一个高质量的哈希函数。
Integers
List.of(a, b)
List.of(c, d)
b - d
c - a
Object.hashCode
上一个:空列表相等性如何工作?
下一个:如何控制多元组的相等性?
评论
*31+