java.util.UUID.randomUUID()。toString()长度是否总是等于36?
我无法找到相关信息。 Here只说以下内容:
public static UUID randomUUID() 静态工厂检索类型4(伪随机生成)UUID。使用加密强伪随机数生成器生成UUID。 返回: 随机生成的UUID
type 4
没有告诉我什么。我不知道在这种情况下4型是什么意思。
答案 0 :(得分:42)
java.util.UUID.randomUUID()。toString()长度是否总是等于36?
UUID
实际上是128位值(2长)。要将128位表示为十六进制字符串,将有128/4=32
个字符(每个字符长度为4位)。在字符串格式中,它还包含4(-
),这就是长度为36的原因。
54947df8-0e9e-4471-a2f9-9af509fb5889
32 hex char + 4 hyphen char = 36 char。所以长度总是一样的。
我不知道案件中的4型是什么意思。?
仅供参考:有几种方法可以生成UUID。这里类型4表示使用随机或伪随机数生成此uuid。来自wiki - Universally_unique_identifier#Versions:
版本
对于变体1和2,五个"版本"在标准中定义,并且在特定用例中每个版本可能比其他版本更合适。版本由字符串表示中的M表示。
版本1 UUID是根据时间和节点ID(通常是MAC地址)生成的;
版本2 UUID是根据标识符(通常是组或用户ID),时间和节点ID生成的;
版本3和5 生成通过散列命名空间标识符和名称生成的确定性UUID;
和版本4 UUID是使用随机或伪随机数生成的。
答案 1 :(得分:2)
您可以使用base64将UUIDv4 16字节二进制转换为24字节ascii,而不是编码为ascii-hex(32字节)
答案 2 :(得分:0)
对于像我这样在阅读javadoc之前开始进行谷歌搜索的人,这里是javadoc;)
对于那些不知道如何阅读从下到上的语法树的人。
hexDigit 是一个字符
hexOctet 是2 hexDigits = 2chars
节点是6 * hexOctet = 6 * 2hexdigit = 6 * 2个字符= 12个字符
变体的顺序是2 * hexOctet = 2 * 2hexdigit = 2 * 2个字符= 4个字符
time_high_and_version 是2 * hexOctet = 2 * 2hexdigit = 2 * 2个字符= 4个字符
time_mid 是2 * hexOctet = 2 * 2hexdigit = 2 * 2个字符= 4个字符
time_low 是4 * hexOctet = 4 * 2hexdigit = 4 * 2个字符= 8个字符
最后, UUID 是
= 8个字符+ 1个字符+ 4个字符+ 1个字符+ 4个字符+ 1个字符+ 4个字符+ 1个字符+ 12个字符
= 36个字符!如前所述,128位数据+ 4个连字符
The UUID string representation is as described by this BNF:
UUID = <time_low> "-" <time_mid> "-"
<time_high_and_version> "-"
<variant_and_sequence> "-"
<node>
time_low = 4*<hexOctet>
time_mid = 2*<hexOctet>
time_high_and_version = 2*<hexOctet>
variant_and_sequence = 2*<hexOctet>
node = 6*<hexOctet>
hexOctet = <hexDigit><hexDigit>
hexDigit =
"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
| "a" | "b" | "c" | "d" | "e" | "f"
| "A" | "B" | "C" | "D" | "E" | "F"