乐趣区

JavaScript生成一个不重复的ID

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID():String{}

先看看下面的几个方法

1. 生成 [0,1) 的随机数的 Math.random, 例如

// 我这次运行生成的是:0.5834165740043102
Math.random()

2. 获取当前时间戳 Date.now

// 现在时间戳是 1482645606622
Date.now() = 1521009303858

3. 将 10 进制转换为其他进制的字符串 Number.toString

// 将 1482645606622 转换成二进制:10101100100110100100100001001000011011110
(1482645606622).toString(2)
// 转换成 16 进制:159349090de MongDB 中的 ObjectID 就是 24 位 16 进制数
(1482645606622).toString(16);// 最大进制支持转为 36 进制,使用字符是 0 -9a-z:ix48wvry
(1482645606622).toString(36)

GenNonDuplicateID 的自我进化

1. 随机数版本 v0.0.1

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(){return Math.random().toString()}

// 生成一个类似 0.1283460319177394 的 ID
GenNonDuplicateID()

2. 随机数版本 16 进制版本 v0.0.2

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(){return Math.random().toString(16)
}

// 函数将生成类似 0.c1615913fa915 的 ID
GenNonDuplicateID()

3. 随机数版本 36 进制版本 v0.0.3

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(){return Math.random().toString(36)
}

// 函数将生成类似 0.hefy7uw6ddzwidkwcmxkzkt9 的 ID
GenNonDuplicateID()

4. 随机数版本 36 进制版本 去掉 ”0.” v0.0.4

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(){return Math.random().toString(36).substr(3)
}

// 函数将生成类似 8dlv9vabygks2cbg1spds4i 的 ID
GenNonDuplicateID()

然而用一个随机数作为 ID,随着使用次数的累积,必然会出现相同的两个 ID

5. 引入时间戳 的 36 微进制版本 v0.1.1

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(){let idStr = Date.now().toString(36)
  idStr += Math.random().toString(36).substr(3)
  return idStr
}

// 函数将生成类似 ix49sfsnt7514k5wpflyb5l2vtok9y66r 的 ID
GenNonDuplicateID()

6. 引入时间戳 的 36 微进制版本 加入随机数长度控制 v0.1.2

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(randomLength){let idStr = Date.now().toString(36)
  idStr += Math.random().toString(36).substr(3,randomLength)
  return idStr
}

// GenNonDuplicateID(3) 将生成类似 ix49wl2978w 的 ID
GenNonDuplicateID(3)

这样生成的 ID 前面几位总是相同,看着不爽,于是再改改

7. 引入时间戳 随机数前置 36 进制 加入随机数长度控制 v0.1.3

/**
 * 生成一个用不重复的 ID
 */
function GenNonDuplicateID(randomLength){return Number(Math.random().toString().substr(3,randomLength) + Date.now()).toString(36)
}
//GenNonDuplicateID()将生成 rfmipbs8ag0kgkcogc 类似的 ID
GenNonDuplicateID()
退出移动版