当前位置: 首页 > news >正文

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-446655440000

32 个十六进制字符,分成 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 里需要编码)
日志追踪 IDUUID36(可读性好)
纯存储/比较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()Uint8Array16字节二进制协议,底层处理

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

http://www.cnnetsun.cn/news/2634426.html

相关文章:

  • 从Shader代码到运行时:手把手教你让URP材质球同时支持SRP Batcher和GPU Instancing
  • AS2564 100V 14.5mR 高性能开关电源同步整流芯片
  • 惠普暗影精灵7装Ubuntu 20.04,搞定RTX3050显卡驱动的保姆级避坑指南
  • 如何用XXMI Launcher一站式管理6款热门游戏模组:终极完整教程
  • PDF 翻译排版大师新手实操指南
  • 车载AI卡 防护对比 和h100 天数智芯 沐曦 机密计算
  • NLP —— 迁移学习 FastText
  • 职业倦怠的识别与应对:从个人能量管理到组织健康构建
  • UE5静态网格体也能玩变形?手把手教你用Morph Targets实现动态环境交互(材质顶点偏移实战)
  • 微信聊天记录数据备份:3步学会用WeChatExporter安全导出你的珍贵回忆
  • 手把手教你学 Simulink—— 基于滑模观测器(SMO)的电动汽车电机无位置传感器控制仿真
  • 从1080P到8K视频:FPGA的BANK设计如何影响你的LVDS接口性能?以Xilinx 7系列为例
  • Claude Code / Codex 一键安装器 (附带C#源码,MIT开源)
  • 厌倦了在编辑器、终端和浏览器之间频繁切换?试试这个基于无限画布(类Figma风格)的下一代开源桌面开发环境“Cate”
  • TVA凭什么成为具身机器人的“类人智眼“(3)
  • 费米悖论五层拆解:从德雷克方程到大过滤器,探寻宇宙寂静之谜
  • SketchUp STL插件终极指南:5步掌握3D打印模型导入导出
  • 免费开源AMD Ryzen调试工具:SMUDebugTool完全指南
  • 【Mysql】B+树索引
  • 强化基准精度管理,优化传动设备全生命周期成本
  • 别再乱卸载补丁了!Win10/11共享打印机报错0x0000011b,试试这个注册表一键修复法
  • PPO算法里的GAE到底怎么算?一个PyTorch逆向遍历代码带你彻底搞懂优势估计
  • 别再死磕有限元了!用Python和PyTorch快速上手PINN,搞定偏微分方程反问题
  • 神经形态计算与氧化物界面器件的存算一体技术
  • 信号处理避坑指南:你的Savitzky-Golay滤波器用对了吗?详解阶数、窗长与延迟那些事儿
  • ARMv7-M架构LDM/STM指令中断机制解析
  • 别再只盯着LOF了!盘点5种更高效的异常检测算法(附Python代码与适用场景指南)
  • 别再死记硬背了!用‘悬崖行走’游戏带你直观理解Model-based和Model-free的区别
  • 如何彻底解放你的QQ音乐:qmcdump终极音频解密指南
  • RePKG:解锁Wallpaper Engine壁纸资源的钥匙