JavaScript 实现不重复 ID 生成器的演进与优化
本文详细解析了基于 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()
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!
怎么使用 JavaScript import() 实现模块的条件加载
2026-11-05 14:44:45
前端防御XSS攻击:怎么防止恶意JS注入与CSP策略配置
2026-11-04 08:51:38
怎么解决 Turf.js 处理大规模 GeoJSON 数据的性能瓶颈
2026-11-03 23:22:19
为什么不建议在JS中手动拼接JSON字符串?
2026-11-03 22:48:27
代码混淆对JS执行性能的影响测试与分析
2026-11-03 22:25:37
