我正在寻找一个散列函数,它可以用于Java中的非加密目的。困难在于,大多数散列函数返回的整数值(-,0,+)不能在每个上下文中用作标识符(例如,在URL中不能使用负数)。这个问题的一个解决方案是,我想出了一个32位签名int,并将其转换为32位无符号int,并将其存储在一个长时间内。这个效果很好。然而,32位随机信息使得哈希冲突在我们的设置中过于频繁。解决这一问题的一种方法是使用64位散列函数(相同的SipHash工作很好),并将有符号整数转换为无符号整数,方法是向右移动一个整数,并使0位于MSB位置。我试着用Java >>操作符来实现这一点,但是结果没有意义。
//Using Guava
private final static HashFunction hashFunction = Hashing.sipHash24();
private static int getRandomInt() {
return hashFunction.newHasher().putLong(rnd.nextLong()).hash().asInt();
}
private static long getRandomLong(){
return hashFunction.newHasher().putLong(rnd.nextLong()).hash().asLong();
}比特转移:
System.out.println(Long.toBinaryString(-2147483648L >> 1));
1111111111111111111111111111111111000000000000000000000000000000我缺少了什么,如何将62位无符号整数哈希值存储在Java中的64位int (long)中?
UPDATE1:
在做了一些研究之后,我终于找到了一种方法来正确地显示>>>对一个长值的影响:
System.out.println(
String.format("%64s", Long.toBinaryString(-2147483648L))
.replace(' ', '0'));
System.out.println(
String.format("%64s", Long.toBinaryString(-2147483648L >>> 1))
.replace(' ', '0'));
1111111111111111111111111111111110000000000000000000000000000000
0111111111111111111111111111111111000000000000000000000000000000发布于 2017-03-28 22:13:54
a >> b
将a向右移动b位。在左边,它重复了已经存在的位(符号扩展!)。示例:
a >>> b
也可以用b位向右移动a,但不对扩展进行签名。它总是在左边加零:
https://stackoverflow.com/questions/43080638
复制相似问题