gpt4 book ai didi

java - 有效 Java hashCode() 实现中的位移位

转载 作者:太空宇宙 更新时间:2023-11-04 14:56:25 24 4
gpt4 key购买 nike

我想知道是否有人可以详细解释一下

(int)(l ^ (l >>> 32));

在以下hashcode实现中执行(由eclipse生成,但与Effective Java相同):

private int i;
private char c;
private boolean b;
private short s;
private long l;
private double d;
private float f;

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + i;
result = prime * result + s;
result = prime * result + (b ? 1231 : 1237);
result = prime * result + c;
long t = Double.doubleToLongBits(d);
result = prime * result + (int) (t ^ (t >>> 32));
result = prime * result + Float.floatToIntBits(f);
result = prime * result + (int) (l ^ (l >>> 32));
return result;
}

谢谢!

最佳答案

基本上,它将 long 的高 32 位与低 32 位进行异或。这是分解版本:

// Unsigned shift by 32 bits, so top 32 bits of topBits will be 0,
// bottom 32 bits of topBits will be the top 32 bits of l
long topBits = l >>> 32;

// XOR topBits with l; the top 32 bits will effectively be left
// alone, but that doesn't matter because of the next step. The
// bottom 32 bits will be the XOR of the top and bottom 32 bits of l
long xor = l ^ topBits;

// Convert the long to an int - this basically ditches the top 32 bits
int hash = (int) xor;

回答您的评论:您有一个 long 值,必须将其转换为 int 才能成为哈希的一部分(结果必须仅为 32 位)。你打算怎么做?您可以仅采用底部 32 位 - 但这意味着顶部 32 位的更改将被忽略,这不会使其成为一个非常好的哈希值。这样,输入的单个位的更改总是会导致散列的单个位的更改。诚然,您仍然可以轻松地发生冲突 - 例如,更改第 7 位和第 39 位,或任何其他相距 32 个位置的位对 - 但情况必然如此,因为您要从264 个可能值到 232

关于java - 有效 Java hashCode() 实现中的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com