我需要生成一个唯一的长整型值,因此我决定使用UUID:
UUID.randomUUID().getLeastSignificantBits();
我注意到的一个奇怪的事情是,UUID.randomUUID().getLeastSignificantBits()
总是返回负值。我很困惑。我是否漏掉了什么?
维基百科指出:
版本4的UUID仅依赖于随机数生成方案。该算法设置版本号(4位)以及两个保留位。其余所有位(剩下的122位)都使用随机或伪随机数据源进行设置。
版本4的UUID采用xxxxyyyy-xxxx-4xxx-yxxx-xxxxxxxxxxxx的格式,其中x是任意16进制数字,y是以下值中的一个:8、9、A或B。
因此,最低位的后半部分的第一位始终为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());
}