Java中使用无符号整数的非加密哈希

Java中使用无符号整数的非加密哈希,java,hash,Java,Hash,我正在寻找一个可以在Java中用于非加密目的的哈希函数。挑战在于大多数散列函数返回有符号整数值(-,0,+),不能在每个上下文中用作标识符(例如,不能在URL中使用负整数)。这个问题的一个解决方案是,我提出的是使用一个32位有符号整数,并将其转换为一个32位无符号整数,然后将其存储在一个长字符串中。这很有效。然而,32位随机信息使得哈希冲突在我们的设置中过于频繁。解决此问题的一种方法是使用64位散列函数(相同的SipHash可以正常工作),并通过将1向右移动并使0位于MSB位置,将该有符号整数转

我正在寻找一个可以在Java中用于非加密目的的哈希函数。挑战在于大多数散列函数返回有符号整数值(-,0,+),不能在每个上下文中用作标识符(例如,不能在URL中使用负整数)。这个问题的一个解决方案是,我提出的是使用一个32位有符号整数,并将其转换为一个32位无符号整数,然后将其存储在一个长字符串中。这很有效。然而,32位随机信息使得哈希冲突在我们的设置中过于频繁。解决此问题的一种方法是使用64位散列函数(相同的SipHash可以正常工作),并通过将1向右移动并使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
我遗漏了什么?在Java中,如何将62位无符号整数散列值存储在64位int(long)中

更新1:

在做了一些研究之后,我终于找到了一种方法来正确显示>>>对长值的影响:

        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
a>>b

将a向右移位b位。在左边,它重复已经存在的位(符号延伸!)。 示例:

  • 101010>>1=110101
  • 010101>>1=001010
a>>>b

也将a向右移动b位,但不符号扩展。它总是在左侧添加零:

  • 101010>>>1=010101
  • 010101>>>1=001010
    • a>>b

      将a向右移位b位。在左边,它重复已经存在的位(符号延伸!)。 示例:

      • 101010>>1=110101
      • 010101>>1=001010
      a>>>b

      也将a向右移动b位,但不符号扩展。它总是在左侧添加零:

      • 101010>>>1=010101
      • 010101>>>1=001010

      为什么不能在url中使用负值?另外,请尝试(无符号右移)而不是
      >
      (有符号右移)。@ElliottFrisch谢谢!因为/-123123/看起来与/123123/非常相似,并且基于此值的路由不支持负值。为什么不能在url中使用负值?另外,请尝试(无符号右移)而不是
      >
      (有符号右移)。@ElliottFrisch谢谢!因为/-123123/看起来与/123123/非常相似,并且基于此值的路由不支持为负值。