64位随机数值十六进制给出16个字符有时15个字符为什么?

时间:2017-06-14 12:15:14

标签: java hex long-integer

我在应用程序中有一个场景,我需要生成一个ID,它应该是十六进制表示的随机64位值,

到目前为止我做了什么,

 Random randomLong = new Random();
 long m = randomLong.nextLong();
 String uid = Long.toHexString(m);

o / p可能像 43c45c243f90326a 82cf8e3863102f3a 等。 但不是每次它给出16个字符,而是15个字符而不是我不明白为什么:(

以十六进制表示形式获取包含16个字符的随机64位值的最有效方法是什么

3 个答案:

答案 0 :(得分:6)

使用String.format()

long value=123L;
String uid = String.format("%016x", value);
// 000000000000007b

一句解释:

每个十六进制数字代表4位。 64位长可以用16(64/4)个十六进制字符表示。要包含前导零,您需要16个十六进制数字。所以你的格式说明符是%016x。基本上,%x用于修改十六进制,方法是将016插入左边的零填充,以实现最小宽度为16个字符。

答案 1 :(得分:1)

这是因为toHExString方法没有将前导零添加到你要转换的随机数,如果数字只能用一个字符表示为十六进制,那么你得到的就是一个字符

看到这个

    String uid = Long.toHexString(-1L);
    String uid2 = Long.toHexString(1L);
    System.out.println(uid);
    System.out.println(uid2);

输出

  

FFFFFFFFFFFFFFFF

     

1

-1将需要表示64位但是1不

编辑:

如果你总是需要16个半字节,那么格式化该字符串以添加缺失的零

 String uid = String.format("%016x", Long.toHexString(1L)); 

答案 2 :(得分:0)

String.format("%016x", uid);

这将添加前导0或'填充' 好像十六进制数小于填充全部16,它不会显示16位数。

enter image description here