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"
.您可以使用 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() 长度的主要内容,如果未能解决你的问题,请参考以下文章