标准库 Uuid Kotlin 2.0.20+
源:Kotlin standard library - Uuid
在 Kotlin 2.0.20 之前,处理 UUID (Universally Unique Identifier) 通常依赖于 Java 的 java.util.UUID 或其他平台的特定实现。这在 Kotlin Multiplatform (KMP) 项目中导致了额外的样板代码或依赖第三方库。
Kotlin 2.0.20 引入了 kotlin.uuid.Uuid 类,提供了一个纯 Kotlin、跨平台、高性能的 UUID 实现,支持生成、解析和格式化 UUID。
核心特性
- 跨平台一致性:在 JVM, Native, JS, Wasm 上行为一致。
- 符合标准:完全遵循 RFC 4122 标准。
- 性能优化:针对各平台进行了底层优化,特别是在字符串解析和序列化方面。
- 类型安全:实现了
Comparable接口,支持自然排序。
基础用法
生成 UUID
目前标准库主要支持生成 版本 4 (基于随机数) 的 UUID,这是最常用的版本。
kotlin
import kotlin.uuid.Uuid
// 生成一个新的随机 UUID (v4)
val randomId = Uuid.random()
println(randomId)
// 输出示例: 550e8400-e29b-41d4-a716-446655440000解析字符串
支持解析标准的 36 字符格式(带连字符)和 32 字符格式(不带连字符)。
kotlin
val uuidString = "550e8400-e29b-41d4-a716-446655440000"
val uuid = Uuid.parse(uuidString)kotlin
val hexString = "550e8400e29b41d4a716446655440000"
val uuidFromHex = Uuid.parseHex(hexString)kotlin
// 如果格式无效,返回 null 而不是抛出异常
val safeUuid = Uuid.parseOrNull("invalid-uuid") // null格式化输出
kotlin
val id = Uuid.random()
// 标准格式 (8-4-4-4-12)
println(id.toString())
// "550e8400-e29b-41d4-a716-446655440000"
// 十六进制格式 (32 chars)
println(id.toHexString())
// "550e8400e29b41d4a716446655440000"进阶操作
字节操作
在网络传输或数据库存储时,直接操作字节通常比字符串更高效。Uuid 占用 16 个字节(128 位)。
kotlin
val id = Uuid.random()
// 转换为字节数组
val bytes: ByteArray = id.toByteArray()
// 从字节数组重建
val restoredId = Uuid.fromByteArray(bytes)从 Long 构建
UUID 本质上由两个 64 位的 Long 组成(高位和低位)。
kotlin
val mostSigBits = 123456789L
val leastSigBits = 987654321L
val id = Uuid.fromLongs(mostSigBits, leastSigBits)与 Java UUID 互操作 (JVM)
在 JVM 平台上,可能需要与遗留的 java.util.UUID 进行交互。虽然 Kotlin 的 Uuid 是独立实现的,但转换非常简单。
kotlin
import kotlin.uuid.Uuid
import kotlin.uuid.toJavaUuid
val kotlinUuid = Uuid.random()
val javaUuid: java.util.UUID = kotlinUuid.toJavaUuid()kotlin
import java.util.UUID
import kotlin.uuid.toKotlinUuid
val javaUuid = UUID.randomUUID()
val kotlinUuid: kotlin.uuid.Uuid = javaUuid.toKotlinUuid()最佳实践
- KMP 项目首选:在任何多平台代码中,无条件使用
kotlin.uuid.Uuid。 - 数据库实体 ID:配合
@Serializable(kotlinx.serialization) 使用时,能够直接序列化为字符串,无需额外的 Serializer(需确认 serialization 库版本支持或自定义 serializer)。 - 避免手动构造:尽量使用
Uuid.random()或Uuid.parse(),避免手动位操作构造 UUID,除非你非常清楚 RFC 4122 的版本和变体位要求。