JavaScript 生成唯一ID的几种方式


Posted in Javascript onFebruary 19, 2021

可行方案

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

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

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

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

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);

改进版本一:随机数  + toString()

1.随机数版本 

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

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

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

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

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

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

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

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

4.随机数版本36进制版本

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

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

总结

优势:使用toString的进制转化可以实现更短的字符串表示更多的范围

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

改进版本二

1.引入时间戳 + 36进制版本 

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

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

2.引入时间戳 + 36进制版本 + 随机数长度控制

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

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

但是,这样生成的ID前面几位总是相同。

3. 引入时间戳 + 随机数前置 36进制 + 随机数长度控制

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

总结

只使用时间戳,有个能在同一时间多人访问生成的是一样的。加上随机数可以实现唯一。再加上自定义长度,使UUID更灵活。

总结

万能方案:

/**
 * 生成一个用不重复的ID
 * @param { Number } randomLength 
 */
function getUuiD(randomLength){
 return Number(Math.random().toString().substr(2,randomLength) + Date.now()).toString(36)
}

以上就是JavaScript 生成唯一ID的几种方式的详细内容,更多关于JavaScript 生成唯一ID的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript 继承机制的实现
Aug 12 Javascript
js操作table示例(个人心得)
Nov 29 Javascript
解析javascript瀑布流原理实现图片滚动加载
Mar 10 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 Javascript
微信分享调用jssdk实例
Jun 08 Javascript
JavaScript之filter_动力节点Java学院整理
Jun 28 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
在vue中使用jsx语法的使用方法
Sep 30 Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 Javascript
JavaScript实现打字游戏
Feb 19 #Javascript
JS+CSS实现动态时钟
Feb 19 #Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 #Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 #Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 #Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 #Vue.js
Vue如何实现变量表达式选择器
Feb 18 #Vue.js
You might like
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
浅入深出Vue之自动化路由
2019/08/06 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
Django静态文件加载失败解决方案
2020/08/26 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
过滤器的用法
2013/10/08 面试题
人力资源专员自我评价怎么写
2013/09/19 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
关于分班的感言
2015/08/04 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python