鸿蒙NEXT开辟随机工具类RandomUtil(ArkTs)

[复制链接]
发表于 2025-10-2 13:25:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
import { util } from '@kit.ArkTS';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
 
/**
 * 随机工具类
 * author: 鸿蒙布道师
 * since: 2025/04/01
 */
export class RandomUtil {
  /**
   * 天生随机布尔值
   * @returns true 或 false
   */
  static getRandomBoolean(): boolean {
    return Math.random() >= 0.5;
  }
 
  /**
   * 天生指定范围内的随机整数
   * @param min 最小值(包罗)
   * @param max 最大值(不包罗)
   * @returns 随机整数
   */
  static getRandomInt(min: number = 0, max: number = Number.MAX_SAFE_INTEGER): number {
    return Math.floor(Math.random() * (max - min) + min);
  }
 
  /**
   * 天生指定范围内的随机浮点数
   * @param min 最小值(包罗)
   * @param max 最大值(不包罗)
   * @returns 随机浮点数
   */
  static getRandomNumber(min: number, max: number): number {
    return Math.random() * (max - min) + min;
  }
 
  /**
   * 天生 [0, limit) 范围内的随机整数
   * @param limit 上限值(不包罗)
   * @returns 随机整数
   */
  static getRandomLimit(limit: number): number {
    return Math.floor(Math.random() * limit);
  }
 
  /**
   * 天生一个随机汉字(Unicode 范围 '\u4E00'-'\u9FFF')
   * @returns 随机的汉字字符
   */
  static getRandomChineseChar(): string {
    const start = 0x4e00; // 汉字起始 Unicode 编码
    const end = 0x9fff;   // 汉字竣事 Unicode 编码
    return String.fromCharCode(RandomUtil.getRandomInt(start, end + 1));
  }
 
  /**
   * 天生指定长度的随机汉字字符串
   * @param length 目标长度
   * @returns 随机汉字字符串
   */
  static getRandomChinese(length: number): string {
    return Array.from<string, string>({ length }, (): string => RandomUtil.getRandomChineseChar()).join('');
  }
 
  /**
   * 根据指定字符池天生随机字符串
   * @param length 目标长度
   * @param strPool 字符池
   * @returns 随机字符串
   */
  static getRandomStr(length: number, strPool: string): string {
    const poolLength = strPool.length;
    return Array.from<string, string>({ length }, (): string => strPool[RandomUtil.getRandomLimit(poolLength)]).join('');
  }
 
  /**
   * 天生随机颜色(十六进制格式)
   * @returns 十六进制颜色字符串
   */
  static getRandomColor(): string {
    const hexadecimal = '0123456789ABCDEF'.split(''); // 将字符串拆分为字符数组
    return '#' + Array.from<string, string>({ length: 6 }, (): string => hexadecimal[RandomUtil.getRandomLimit(16)]).join('');
  }
 
  /**
   * 天生随机指定长度的 DataBlob
   * @param length 数据长度
   * @returns DataBlob 对象
   */
  static getRandomDataBlob(length: number): cryptoFramework.DataBlob {
    return cryptoFramework.createRandom().generateRandomSync(length);
  }
 
  /**
   * 天生随机指定长度的 Uint8Array
   * @param length 数据长度
   * @returns Uint8Array 数据
   */
  static getRandomUint8Array(length: number): Uint8Array {
    return RandomUtil.getRandomDataBlob(length).data;
  }
 
  /**
   * 天生 36 位 UUID(带分隔符)
   * @returns 36 位 UUID 字符串
   */
  static generateUUID36(): string {
    return RandomUtil.generateUUIDInternal(36, [8, 13, 18, 23]);
  }
 
  /**
   * 天生 32 位 UUID(带分隔符)
   * @returns 32 位 UUID 字符串
   */
  static generateUUID32(): string {
    return RandomUtil.generateUUIDInternal(32, [8, 12, 16, 20]);
  }
 
  /**
   * 内部方法:天生通用 UUID
   * @param length UUID 总长度
   * @param separators 分隔符位置数组
   * @returns UUID 字符串
   */
  private static generateUUIDInternal(length: number, separators: number[]): string {
    const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
    let rand = 0;
 
    // 利用 Array.from 并显式指定泛型参数
    return Array.from<string, string>(
      { length }, // 第一个泛型参数:输入对象的范例
      (_, i): string => { // 第二个泛型参数:回调函数返回值的范例
        if (separators.includes(i)) return '-'; // 插入分隔符
        if (i === 14) return '4'; // UUID 版本号(第14位固定为4)
        if (rand <= 0x02) rand = 0x2000000 + Math.random() * 0x1000000 | 0; // 更新随机数缓存
        const r = rand & 0xf; // 取低4位
        rand >>= 4; // 移动到下一个4位
        return chars[(i === 19 || i === 12) ? (r & 0x3) | 0x8 : r];
      }
    ).join(''); // 将字符数组拼接成字符串
  }
  /**
   * 利用加密安全随机数天生器天生 RFC 4122 版本 4 的字符串范例 UUID
   * @param entropyCache 是否利用缓存,默认 true
   * @returns UUID 字符串
   */
  static generateRandomUUID(entropyCache: boolean = true): string {
    return util.generateRandomUUID(entropyCache);
  }
 
  /**
   * 利用加密安全随机数天生器天生 RFC 4122 版本 4 的 Uint8Array 范例 UUID
   * @param entropyCache 是否利用缓存,默认 true
   * @returns Uint8Array 数据
   */
  static generateRandomBinaryUUID(entropyCache: boolean = true): Uint8Array {
    return util.generateRandomBinaryUUID(entropyCache);
  }
}
  1. import { util } from '@kit.ArkTS';
  2. import { cryptoFramework } from '@kit.CryptoArchitectureKit';
  3. /**
  4. * 随机工具类
  5. * author: 鸿蒙布道师
  6. * since: 2025/04/01
  7. */
  8. export class RandomUtil {
  9.   /**
  10.    * 生成随机布尔值
  11.    * @returns true 或 false
  12.    */
  13.   static getRandomBoolean(): boolean {
  14.     return Math.random() >= 0.5;
  15.   }
  16.   /**
  17.    * 生成指定范围内的随机整数
  18.    * @param min 最小值(包含)
  19.    * @param max 最大值(不包含)
  20.    * @returns 随机整数
  21.    */
  22.   static getRandomInt(min: number = 0, max: number = Number.MAX_SAFE_INTEGER): number {
  23.     return Math.floor(Math.random() * (max - min) + min);
  24.   }
  25.   /**
  26.    * 生成指定范围内的随机浮点数
  27.    * @param min 最小值(包含)
  28.    * @param max 最大值(不包含)
  29.    * @returns 随机浮点数
  30.    */
  31.   static getRandomNumber(min: number, max: number): number {
  32.     return Math.random() * (max - min) + min;
  33.   }
  34.   /**
  35.    * 生成 [0, limit) 范围内的随机整数
  36.    * @param limit 上限值(不包含)
  37.    * @returns 随机整数
  38.    */
  39.   static getRandomLimit(limit: number): number {
  40.     return Math.floor(Math.random() * limit);
  41.   }
  42.   /**
  43.    * 生成一个随机汉字(Unicode 范围 '\u4E00'-'\u9FFF')
  44.    * @returns 随机的汉字字符
  45.    */
  46.   static getRandomChineseChar(): string {
  47.     const start = 0x4e00; // 汉字起始 Unicode 编码
  48.     const end = 0x9fff;   // 汉字结束 Unicode 编码
  49.     return String.fromCharCode(RandomUtil.getRandomInt(start, end + 1));
  50.   }
  51.   /**
  52.    * 生成指定长度的随机汉字字符串
  53.    * @param length 目标长度
  54.    * @returns 随机汉字字符串
  55.    */
  56.   static getRandomChinese(length: number): string {
  57.     return Array.from<string, string>({ length }, (): string => RandomUtil.getRandomChineseChar()).join('');
  58.   }
  59.   /**
  60.    * 根据指定字符池生成随机字符串
  61.    * @param length 目标长度
  62.    * @param strPool 字符池
  63.    * @returns 随机字符串
  64.    */
  65.   static getRandomStr(length: number, strPool: string): string {
  66.     const poolLength = strPool.length;
  67.     return Array.from<string, string>({ length }, (): string => strPool[RandomUtil.getRandomLimit(poolLength)]).join('');
  68.   }
  69.   /**
  70.    * 生成随机颜色(十六进制格式)
  71.    * @returns 十六进制颜色字符串
  72.    */
  73.   static getRandomColor(): string {
  74.     const hexadecimal = '0123456789ABCDEF'.split(''); // 将字符串拆分为字符数组
  75.     return '#' + Array.from<string, string>({ length: 6 }, (): string => hexadecimal[RandomUtil.getRandomLimit(16)]).join('');
  76.   }
  77.   /**
  78.    * 生成随机指定长度的 DataBlob
  79.    * @param length 数据长度
  80.    * @returns DataBlob 对象
  81.    */
  82.   static getRandomDataBlob(length: number): cryptoFramework.DataBlob {
  83.     return cryptoFramework.createRandom().generateRandomSync(length);
  84.   }
  85.   /**
  86.    * 生成随机指定长度的 Uint8Array
  87.    * @param length 数据长度
  88.    * @returns Uint8Array 数据
  89.    */
  90.   static getRandomUint8Array(length: number): Uint8Array {
  91.     return RandomUtil.getRandomDataBlob(length).data;
  92.   }
  93.   /**
  94.    * 生成 36 位 UUID(带分隔符)
  95.    * @returns 36 位 UUID 字符串
  96.    */
  97.   static generateUUID36(): string {
  98.     return RandomUtil.generateUUIDInternal(36, [8, 13, 18, 23]);
  99.   }
  100.   /**
  101.    * 生成 32 位 UUID(带分隔符)
  102.    * @returns 32 位 UUID 字符串
  103.    */
  104.   static generateUUID32(): string {
  105.     return RandomUtil.generateUUIDInternal(32, [8, 12, 16, 20]);
  106.   }
  107.   /**
  108.    * 内部方法:生成通用 UUID
  109.    * @param length UUID 总长度
  110.    * @param separators 分隔符位置数组
  111.    * @returns UUID 字符串
  112.    */
  113.   private static generateUUIDInternal(length: number, separators: number[]): string {
  114.     const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  115.     let rand = 0;
  116.     // 使用 Array.from 并显式指定泛型参数
  117.     return Array.from<string, string>(
  118.       { length }, // 第一个泛型参数:输入对象的类型
  119.       (_, i): string => { // 第二个泛型参数:回调函数返回值的类型
  120.         if (separators.includes(i)) return '-'; // 插入分隔符
  121.         if (i === 14) return '4'; // UUID 版本号(第14位固定为4)
  122.         if (rand <= 0x02) rand = 0x2000000 + Math.random() * 0x1000000 | 0; // 更新随机数缓存
  123.         const r = rand & 0xf; // 取低4位
  124.         rand >>= 4; // 移动到下一个4位
  125.         return chars[(i === 19 || i === 12) ? (r & 0x3) | 0x8 : r];
  126.       }
  127.     ).join(''); // 将字符数组拼接成字符串
  128.   }
  129.   /**
  130.    * 使用加密安全随机数生成器生成 RFC 4122 版本 4 的字符串类型 UUID
  131.    * @param entropyCache 是否使用缓存,默认 true
  132.    * @returns UUID 字符串
  133.    */
  134.   static generateRandomUUID(entropyCache: boolean = true): string {
  135.     return util.generateRandomUUID(entropyCache);
  136.   }
  137.   /**
  138.    * 使用加密安全随机数生成器生成 RFC 4122 版本 4 的 Uint8Array 类型 UUID
  139.    * @param entropyCache 是否使用缓存,默认 true
  140.    * @returns Uint8Array 数据
  141.    */
  142.   static generateRandomBinaryUUID(entropyCache: boolean = true): Uint8Array {
  143.     return util.generateRandomBinaryUUID(entropyCache);
  144.   }
  145. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表