Skip to content

random

randomInt

js
// 生成 [min, max] 区间整数(包含两端)
export function randomInt(min, max){
  if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
    if (min > max) [min, max] = [max, min];

    const range = max - min + 1;
    const maxValid = Math.floor(0xFFFFFFFF / range) * range - 1;

    let randomValue;
    do {
      randomValue = crypto.getRandomValues(new Uint32Array(1))[0];
    } while (randomValue > maxValid);

    return (randomValue % range) + min;
  } else {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }
}

randomStr

js
export function randomStr(length, chars = 'abcdefghijklmnopqrstuvwxyz0123456789'){
  let str = ''
  for (let i = 0; i < length; i++) {
    str += chars.charAt(randomInt(0, chars.length - 1))
  }
  return str;
}

randomUUID

js
export function randomUUID(){
  // 使用原生 API(Chrome 92+, Firefox 95+, Safari 15.4+)
  if (typeof crypto !== 'undefined' && crypto.randomUUID) {
    return crypto.randomUUID();
  }

  const UUID_TEMPLATE = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'

  // 降级方案
  return UUID_TEMPLATE.replace(/[xy]/g, (c) => {
    const v = c === 'x' ? randomInt(0, 15) : randomInt(8, 11); // x: [0,15], y: [8,11]
    return v.toString(16); // 转十六进制
  });
}