Skip to content

唯一标识符

guid(length = 32, firstU = true, radix = 62) 该函数可以生产一个全局唯一、随机的 guid,默认首字母为 u,可以用于当做元素的 id 或者 class 名等需要唯一,随机字符串的地方,因为 id 或者 class 不能以数字开头。

  • length <Number | null> guid 的长度,默认为 32,如果取值 null,则按 rfc4122 标准生成对应格式的随机数
  • firstU <Boolean> 首字母是否为"u",如果首字母为数字情况下,不能用作元素的 id 或者 class,默认为 true
  • radix <Number> 生成的基数,默认为 62,用于生成随机数字符串为"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 如果取 2,那么返回的结果就是前两位 0 和 1(可以理解为二进制)的随机结果,如果为 7,返回的字符串就是 0-7(理解为八进制)之间, 10 为十进制,以此类推。

说明:这个方法三个参数都有默认的值,所以您调用的时候,可以无需传递任何参数也是可以的,并且建议您这样做。

js
function guid(len = 32, firstU = true, radix = null) {
  const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  const uuid = []
  radix = radix || chars.length

  if (len) {
    // 如果指定 uuid 长度,只是取随机的字符,0|x 为位运算,能去掉 x 的小数位,返回整数位
    for (let i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]
  } else {
    let r
    // rfc4122 标准要求返回的 uuid 中,某些位为固定的字符
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
    uuid[14] = '4'

    for (let i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16)
        uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r]
      }
    }
  }
  // 移除第一个字符,并用 u 替代,因为第一个字符为数值时,该 guuid 不能用作 id 或者 class
  if (firstU) {
    uuid.shift()
    return `u${uuid.join('')}`
  }
  return uuid.join('')
}