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 相关文章推荐
jquery blockUI 遮罩不能消失与不能提交的解决方法
Sep 17 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
javascript+HTML5自定义元素播放焦点图动画
Feb 21 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
Dec 18 Javascript
浅谈React深度编程之受控组件与非受控组件
Dec 26 Javascript
基于axios封装fetch方法及调用实例
Feb 05 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 Javascript
利用Angular7开发一个Radio组件的全过程
Jul 11 Javascript
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 Javascript
vue中的计算属性和侦听属性
Nov 06 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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
php5数字型字符串加解密代码
2008/04/24 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
JavaScript闭包和回调详解
2017/08/09 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Django接收自定义http header过程详解
2019/08/23 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
奶茶店创业计划书范文
2014/01/17 职场文书
法人任命书范本
2014/06/04 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
公司车队管理制度
2015/08/04 职场文书
志愿者工作心得体会
2016/01/15 职场文书
社区结对共建协议书
2016/03/23 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python