HarmonyOS 开发中的随机数据需求:RandomUtil 全场景实战指南
文章目录背景方法总览场景一验证码生成场景二邀请码和兑换码场景三唯一 ID 生成场景四测试数据生成场景五随机选择与排序场景六随机加密盐SaltRandomUtil 场景速查写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓随机数据生成的需求在应用开发里无处不在。这篇把RandomUtil的所有方法组合起来按实际业务场景整理一次讲清楚。方法总览场景一验证码生成最常见的随机字符串需求——生成短信验证码// 6位纯数字验证码短信验证码标准格式this.Btn(getRandomStr(${this.strLength}, 数字池),#27AE60,(){constvRandomUtil.getRandomStr(this.strLength,0123456789);this.addLog(getRandomStr(${this.strLength}, 0-9) → ${v});})实际使用import{RandomUtil}from../Utils/RandomUtil;// 生成6位短信验证码constsmsCodeRandomUtil.getRandomStr(6,0123456789);// 例如847291// 生成4位图形验证码字母数字constcaptchaRandomUtil.getRandomStr(4,ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789);// 例如k7Pq故意排除了易混淆的字符 0/O/1/l/I场景二邀请码和兑换码// 8位邀请码大写字母数字排除易混淆字符this.Btn(getRandomStr(${this.strLength}, 字母数字混合池),#27AE60,(){constvRandomUtil.getRandomStr(this.strLength,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789);this.addLog(getRandomStr(${this.strLength}, alphanumeric) → ${v});})实际使用// 8位邀请码大写字母数字排除易混淆的 0/O/1/IconstinviteCodeRandomUtil.getRandomStr(8,ABCDEFGHJKLMNPQRSTUVWXYZ23456789);// 例如K7NP3ZA2// 12位兑换码可以包含更多字符增加组合数constredeemCodeRandomUtil.getRandomStr(12,ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789);场景三唯一 ID 生成数据库主键、请求追踪 ID、本地缓存 key// 标准 UUID推荐通用性最好this.Btn(generateUUID36(),#2980B9,(){constvRandomUtil.generateUUID36();this.addLog(generateUUID36() →${v});})// 无横杠 UUIDURL 参数友好this.Btn(generateUUID32(),#2980B9,(){constvRandomUtil.generateUUID32();this.addLog(generateUUID32() →${v});})// 带缓存的 UUID同一会话内复用this.Btn(generateRandomUUID(true) 使用缓存,#1A6BB5,(){constvRandomUtil.generateRandomUUID(true);this.addLog(generateRandomUUID(true) →${v});})实际使用// 给本地数据条目分配唯一 idinterfaceLocalNote{id:string;title:string;content:string;}constnewNote:LocalNote{id:RandomUtil.generateUUID36(),title:新笔记,content:};// 请求日志追踪constrequestIdRandomUtil.generateUUID36();console.info([${requestId}] 发起请求);场景四测试数据生成UI 测试时快速生成填充数据// 随机汉字姓名this.Btn(getRandomChineseChar() 单个汉字,#E74C3C,(){constvRandomUtil.getRandomChineseChar();this.addLog(getRandomChineseChar() → ${v});})this.Btn(getRandomChinese(${this.chineseCount}),#E74C3C,(){constvRandomUtil.getRandomChinese(this.chineseCount);this.addLog(getRandomChinese(${this.chineseCount}) → ${v});})// 随机颜色Button(getRandomColor()).onClick((){constcRandomUtil.getRandomColor();this.randomColorc;this.addLog(getRandomColor() → ${c});})实际使用——批量生成测试用户数据import{RandomUtil}from../Utils/RandomUtil;interfaceTestUser{id:string;name:string;avatarColor:string;age:number;inviteCode:string;}functiongenerateTestUsers(count:number):TestUser[]{constusers:TestUser[][];for(leti0;icount;i){users.push({id:RandomUtil.generateUUID32(),name:RandomUtil.getRandomChinese(RandomUtil.getRandomInt(2,3)),avatarColor:RandomUtil.getRandomColor(),age:RandomUtil.getRandomInt(18,65),inviteCode:RandomUtil.getRandomStr(8,ABCDEFGHJKLMNPQRSTUVWXYZ23456789)});}returnusers;}// 生成 10 个测试用户consttestUsersgenerateTestUsers(10);场景五随机选择与排序从数组中随机取元素给列表随机排序// getRandomLimit 生成 [0, limit) 范围的随机整数适合作数组索引this.Btn(getRandomLimit(20),#9B59B6,(){constvRandomUtil.getRandomLimit(20);this.addLog(getRandomLimit(20) →${v}(范围[0,20)));})实际使用constfruits[苹果,香蕉,橙子,葡萄,西瓜];// 随机选一个constrandomFruitfruits[RandomUtil.getRandomLimit(fruits.length)];// 随机打乱数组Fisher-Yates 洗牌算法functionshuffleArrayT(arr:T[]):T[]{constresult[...arr];for(letiresult.length-1;i0;i--){constjRandomUtil.getRandomLimit(i1);[result[i],result[j]][result[j],result[i]];}returnresult;}constshuffledshuffleArray(fruits);场景六随机加密盐Salt密码存储时需要随机盐// 随机字节数组适合加密场景this.Btn(getRandomDataBlob(8),#E67E22,(){constblobRandomUtil.getRandomDataBlob(8);this.addLog(getRandomDataBlob(8).data → [${Array.from(blob.data).join(,)}]);})this.Btn(getRandomUint8Array(6),#E67E22,(){constarrRandomUtil.getRandomUint8Array(6);this.addLog(getRandomUint8Array(6) → [${Array.from(arr).join(,)}]);})实际使用// 生成16字节的随机盐128位常用长度constsaltRandomUtil.getRandomUint8Array(16);// 用于密码哈希hash(password salt)RandomUtil 场景速查业务场景推荐方法示例短信验证码6位数字getRandomStr(6, 0-9)847291邀请码8位字母数字getRandomStr(8, A-Z0-9)K7NP3ZA2数据库主键generateUUID36()标准UUIDURL参数IDgenerateUUID32()无横杠UUID测试用中文名getRandomChinese(2)林青头像背景色getRandomColor()#3A7FD5随机数组索引getRandomLimit(n)0到n-1随机整数范围getRandomInt(min, max)指定范围加密盐getRandomUint8Array(16)16字节写在最后随机数据生成看起来简单但用对方法能省很多事。getRandomStr 字符池 的组合几乎能满足所有字符串随机需求UUID 系列满足唯一 ID 需求getRandomChinese让测试数据生成变得优雅。掌握这一套开发体验会好很多。