JavaScript 实现不重复 ID 生成器的演进与优化

作者:巡夜人时间:2026-10-21 19:01:31浏览:173

本文详细解析了基于 JavaScript 生成不重复 ID 的多种实现方案。从基础的 Math.random 随机数出发,逐步引入 Date.now 时间戳,并结合 toString 进制转换技术,通过 v0.0.1 至 v0.1.3 版本的迭代,优化了 ID 的随机性、长度控制及前缀分布,最终提供了一套高效且低冲突率的 ID 生成策略。

基础方法与核心思路

本文旨在介绍如何使用 JavaScript 构建一个能够生成不重复 ID 的工具。


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

首先回顾几个基础方法,

1. 使用 Math.random 生成 [0,1) 区间内的随机数,例如


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

2. 利用 Date.now 获取当前时间戳,


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

3. 通过 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 版本演进

接下来探讨 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()

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!

作者最新文章