HarmonyOS UUID 生成完全指南:5种方式的区别和最佳实践
文章目录
- 背景
- 总览方法
- UUID 是什么样的?
- generateUUID36:标准 36 字符 UUID
- generateUUID32:32 字符 UUID(无横杠)
- generateRandomUUID:带缓存控制的 UUID
- generateRandomBinaryUUID:二进制格式 UUID
- 5 种 UUID 方法对比
- UUID 的使用场景
- 写在最后
背景
近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦
案例demo导航展示
↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
UUID(Universally Unique Identifier,通用唯一标识符)是一种标准格式的唯一 ID。在需要唯一标识某个对象、请求、会话时,UUID 是最通用的方案。
RandomUtil提供了 5 种 UUID 生成方式,这篇一次全讲清楚。
总览方法
先来看下这个三方库的方法有哪些
UUID 是什么样的?
UUID 的标准格式是这样的:
550e8400-e29b-41d4-a716-44665544000032 个十六进制字符,分成 5 段,用 4 个-连接,格式是8-4-4-4-12。这叫UUID v4(随机生成版本),是最常用的类型。
generateUUID36:标准 36 字符 UUID
生成标准带横杠的 36 字符 UUID:
this.Btn('generateUUID36()','#2980B9',()=>{constv=RandomUtil.generateUUID36();this.addLog(`generateUUID36() →${v}`);})实际运行结果:
generateUUID36()→"550e8400-e29b-41d4-a716-446655440000"这样的字符串- 每次调用结果不同(随机生成)
这是标准 UUID 格式,与所有语言和框架兼容。
generateUUID32:32 字符 UUID(无横杠)
去掉横杠的紧凑格式,32 个字符:
this.Btn('generateUUID32()','#2980B9',()=>{constv=RandomUtil.generateUUID32();this.addLog(`generateUUID32() →${v}`);})实际运行结果:
generateUUID32()→"550e8400e29b41d4a716446655440000"这样的字符串(就是 36 字符版去掉横杠)
UUID36 vs UUID32 怎么选?
| 场景 | 推荐 |
|---|---|
| 数据库主键(兼容性优先) | UUID36(标准格式) |
| URL 参数传递 | UUID32(横杠在 URL 里需要编码) |
| 日志追踪 ID | UUID36(可读性好) |
| 纯存储/比较 | UUID32(更短) |
generateRandomUUID:带缓存控制的 UUID
this.Btn('generateRandomUUID(true) 使用缓存','#1A6BB5',()=>{constv=RandomUtil.generateRandomUUID(true);this.addLog(`generateRandomUUID(true) →${v}`);})this.Btn('generateRandomUUID(false) 不使用缓存','#1A6BB5',()=>{constv=RandomUtil.generateRandomUUID(false);this.addLog(`generateRandomUUID(false) →${v}`);})这个方法有一个布尔参数useCache:
generateRandomUUID(true):使用缓存,多次调用可能返回同一个值(从缓存里拿)generateRandomUUID(false):不使用缓存,每次都重新生成全新的 UUID
什么时候用 true(缓存)?
如果你需要在同一个会话或流程里,多个地方引用同一个唯一 ID,可以用缓存版本。比如生成一个请求 ID,在日志里多处引用这个 ID,希望每次拿到的是同一个。
什么时候用 false(不缓存)?
需要每次都生成不同的唯一 ID 时,用false。比如创建列表每一行的 key,每行需要不同的 ID。
generateRandomBinaryUUID:二进制格式 UUID
UUID 的二进制格式,返回Uint8Array(16字节):
this.Btn('generateRandomBinaryUUID()','#0E5C9A',()=>{constv=RandomUtil.generateRandomBinaryUUID();this.addLog(`generateRandomBinaryUUID() → Uint8Array[${v.length}] [${Array.from(v.slice(0,4)).join(',')}...]`);})实际运行结果:
generateRandomBinaryUUID()→Uint8Array[16] [85, 14, 132, 0...](16字节,128位)
UUID 本质上是 128 位(16字节)的随机数,字符串格式是它的文本表示。二进制格式更紧凑,适合需要在字节层面处理 UUID 的场景(比如自定义二进制协议、加密场景)。
5 种 UUID 方法对比
| 方法 | 返回格式 | 长度 | 适合场景 |
|---|---|---|---|
generateUUID36() | 带横杠字符串 | 36字符 | 标准使用,最通用 |
generateUUID32() | 无横杠字符串 | 32字符 | URL参数,紧凑存储 |
generateRandomUUID(true) | 带横杠字符串 | 36字符 | 需要缓存复用同一ID |
generateRandomUUID(false) | 带横杠字符串 | 36字符 | 每次生成新ID |
generateRandomBinaryUUID() | Uint8Array | 16字节 | 二进制协议,底层处理 |
UUID 的使用场景
1. 数据库记录主键:
interfaceUserRecord{id:string;name:string;}constuser:UserRecord={id:RandomUtil.generateUUID36(),name:'张三'};2. 列表组件 key(避免 ForEach 重渲染问题):
// 给每条数据加唯一 idthis.dataList=items.map(item=>({...item,_key:RandomUtil.generateUUID32()}));// ForEach 中使用ForEach(this.dataList,(item)=>{ListItem(){/* ... */}},(item)=>item._key)3. 请求追踪 ID:
// 每个请求生成一个 requestId,用于日志追踪constrequestId=RandomUtil.generateUUID36();console.info(`[${requestId}] 开始请求...`);// 发送请求console.info(`[${requestId}] 请求完成`);写在最后
UUID 生成是后台开发、数据管理里最基础的工具之一。generateUUID36适合大多数场景,记这一个就够用了。
需要无横杠格式用generateUUID32,需要缓存控制用generateRandomUUID,需要字节格式用generateRandomBinaryUUID。
