java.util.UUID.randomUUID().toString() 长度

Posted

技术标签:

【中文标题】java.util.UUID.randomUUID().toString() 长度【英文标题】:java.util.UUID.randomUUID().toString() length 【发布时间】:2018-01-05 09:08:35 【问题描述】:

是否总是等于 36?

我无法找到这方面的信息。 Here只说以下:

公共静态 UUID randomUUID() 用于检索类型 4(伪随机生成)UUID 的静态工厂。 UUID 是使用加密强的伪随机数生成器生成的。 回报: 一个随机生成的 UUID

type 4 什么也没告诉我。我不知道这种情况下类型 4 是什么意思。

【问题讨论】:

因为 UUID 有定义的长度,所以是的。 'a UUID represents a 128-bit value' 的哪一部分你没看懂? 以下是 Javadoc 关于类型的说明: version 字段包含一个描述此 UUID 类型的值。 UUID 有四种不同的基本类型:基于时间的、DCE 安全的、基于名称的和随机生成的 UUID。这些类型的版本值分别为 1、2、3 和 4。 【参考方案1】:

java.util.UUID.randomUUID().toString() 长度是否总是等于 36?

是的!是的。

UUID 实际上是一个 128 位的值(2 长)。要将 128 位表示为十六进制字符串,将有 128/4=32 字符(每个字符长 4 位)。在字符串格式中,它还包含 4 (-),这就是长度为 36 的原因。

示例:54947df8-0e9e-4471-a2f9-9af509fb5889

32 个十六进制字符 + 4 个连字符 = 36 个字符。所以长度总是一样的。


更新:

不知道案例中的type 4是什么意思?

仅供参考:有几种生成 UUID 的方法。这里类型 4 表示此 uuid 是使用随机或伪随机数生成的。来自维基 - Universally_unique_identifier#Versions:

版本

对于变体 1 和 2,标准中定义了五个“版本”,每个版本在特定用例中可能比其他版本更合适。版本由字符串表示中的 M 表示。

版本 1 UUID 由时间和节点 ID(通常是 MAC 地址)生成;

第 2 版 UUID 由标识符(通常是组或用户 ID)、时间和节点 ID 生成;

版本 3 和 5 通过对命名空间标识符和名称进行散列生成确定性 UUID;

版本 4 UUID 是使用随机或伪随机数生成的。

【讨论】:

那么,它总是 32 个字母数字字符加上 4 个连字符? 是的。 36 个字符的长字符串。 “32 个字母数字字符”实际上并不正确。应该是32 hexOctet and hexOctet = `hexDigit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F".【参考方案2】:

您可以使用 base64 将 UUIDv4 16 字节二进制转换为 24 字节 ascii,而不是编码为 ascii-hex(32 字节)

【讨论】:

尝试突出显示关键字并明确格式,这将有助于为其他人找到答案 这是个好主意,例如我必须将基于 UUID-v4 的标识符系统与另一个将 ID 限制为最大长度 30 个字符的系统集成。【参考方案3】:

对于像我这样在阅读 javadoc 之前开始使用谷歌搜索的人,这里是 javadoc ;)

UUID.toString

对于那些不知道如何阅读从下到上阅读语法树的人。hexDigit 是一个字符hexOctet 是 2 hexDigits = 2chars节点是 6 * hexOctet = 6 * 2hexdigit = 6*2 chars = 12chars变体_and_sequence 是 2 * hexOctet = 2 * 2hexdigit = 2*2 chars = 4charstime_high_and_version 是 2 * hexOctet = 2 * 2hexdigit = 2*2 chars = 4charstime_mid 为 2 * hexOctet = 2 * 2hexdigit = 2*2 chars = 4charstime_low 是 4 * hexOctet = 4* 2hexdigit = 4*2 chars = 8chars 最后,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"

【讨论】:

以上是关于java.util.UUID.randomUUID().toString() 长度的主要内容,如果未能解决你的问题,请参考以下文章

hive sql自动生成自增id;随机id

java怎么产生无重复的流水号!

Scala shell 中的垃圾收集

hibernate使用uuid.hex生成一个32位的主键,java API中有生成类似32位String的方法吗?

Spring中的SPEL表达式常用方法简介