UUID.randomUUID().getLeastSignificantBits()总是返回负值吗?

7

我需要生成一个唯一的长整型值,因此我决定使用UUID:

UUID.randomUUID().getLeastSignificantBits();

我注意到的一个奇怪的事情是,UUID.randomUUID().getLeastSignificantBits()总是返回负值。我很困惑。我是否漏掉了什么?

2个回答

8

维基百科指出:

版本4的UUID仅依赖于随机数生成方案。该算法设置版本号(4位)以及两个保留位。其余所有位(剩下的122位)都使用随机或伪随机数据源进行设置。

版本4的UUID采用xxxxyyyy-xxxx-4xxx-yxxx-xxxxxxxxxxxx的格式,其中x是任意16进制数字,y是以下值中的一个:8、9、A或B。

因此,最低位的后半部分的第一位始终为1,使其成为负数。


谢谢。我明白了。顺便问一下,你有什么生成唯一长整型的建议吗? - Kai
@Kai 这是一个单独的问题(并且在这个网站上已经被问过了)。 - yshavit
SecureRandom#nextLong怎么样? - Thilo

1

这也可能对展示从getLeastSignificantBits()可以期望得到什么有用:

/**
 * @see UUID#getLeastSignificantBits()
 */
public void test_getLeastSignificantBits() {
    UUID uuid = new UUID(0, 0);
    assertEquals(0, uuid.getLeastSignificantBits());
    uuid = new UUID(0, Long.MIN_VALUE);
    assertEquals(Long.MIN_VALUE, uuid.getLeastSignificantBits());
    uuid = new UUID(0, Long.MAX_VALUE);
    assertEquals(Long.MAX_VALUE, uuid.getLeastSignificantBits());
}

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接