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 可能类似于 43c45c243f90326a 或 82cf8e3863102f3a 等。
但不是每次它给出 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 个字符的最小宽度。
我在应用程序中需要生成一个 ID,该 ID 应该是十六进制表示形式的随机 64 位值,
到目前为止我做了什么,
Random randomLong = new Random();
long m = randomLong.nextLong();
String uid = Long.toHexString(m);
o/p 可能类似于 43c45c243f90326a 或 82cf8e3863102f3a 等。 但不是每次它给出 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 个字符的最小宽度。