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

64 bit Random number value in hex gives 16 characters sometimes 15 characters why?

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

到目前为止我做了什么,

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

o/p 可能类似于 43c45c243f90326a82cf8e3863102f3a 等。 但不是每次它给出 16 个字符,而是 15 个字符,我不明白为什么 :(

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

这是因为 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)); 
String.format("%016x", uid);

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

使用String.format()

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

一句话解释:

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