首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用无符号整数在Java中使用非加密散列

使用无符号整数在Java中使用非加密散列
EN

Stack Overflow用户
提问于 2017-03-28 21:55:00
回答 1查看 431关注 0票数 0

我正在寻找一个散列函数,它可以用于Java中的非加密目的。困难在于,大多数散列函数返回的整数值(-,0,+)不能在每个上下文中用作标识符(例如,在URL中不能使用负数)。这个问题的一个解决方案是,我想出了一个32位签名int,并将其转换为32位无符号int,并将其存储在一个长时间内。这个效果很好。然而,32位随机信息使得哈希冲突在我们的设置中过于频繁。解决这一问题的一种方法是使用64位散列函数(相同的SipHash工作很好),并将有符号整数转换为无符号整数,方法是向右移动一个整数,并使0位于MSB位置。我试着用Java >>操作符来实现这一点,但是结果没有意义。

代码语言:javascript
复制
//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();
    }

比特转移:

代码语言:javascript
复制
 System.out.println(Long.toBinaryString(-2147483648L >> 1));
 1111111111111111111111111111111111000000000000000000000000000000

我缺少了什么,如何将62位无符号整数哈希值存储在Java中的64位int (long)中?

UPDATE1:

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

代码语言:javascript
复制
        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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 22:13:54

a >> b

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

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

a >>> b

也可以用b位向右移动a,但不对扩展进行签名。它总是在左边加零:

  • 101010 >>> 1= 010101
  • 010101 >>> 1= 001010
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43080638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档