前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs生成不重复数字的一种办法

nodejs生成不重复数字的一种办法

原创
作者头像
easonxie
修改2021-06-21 00:45:48
2.1K0
修改2021-06-21 00:45:48
举报

背景

最近在做需求的时候,有个管理端接口需要在调用的时候传递一个无符号的32位整形文件ID,也就是0 ~ 4294967295之间的数字,每次调用接口这个文件ID不能重复。

一、数据库解决法

比较正经的做法是,建一个文件的数据库表,设置一个自增的Int类型主键id,然后每同步一个文件之前,插入一个文件到文件的数据库表里,生成一个文件的id,把这个id传递给后台。但是这样比较麻烦,毕竟我们的目的只是需要一个不重复的文件id,为了这个目的做太多的事情就得不偿失了。

二、利用时间戳

JS的时间戳转成数字是13位,32位的无符号整形数字最大是4294967295,没办法直接把时间戳当成文件id来使用。可以换一种思路。通过JS的Data.now()获取当前的时间戳,减去一个指定的时间戳,算出两者直接的时间间隔,然后把这个时间间隔乘以100,然后再加上0-99的随机数。

这样生成的数字,个位和十位是随机数,百位以上是自增的时间戳。基本不可能重复,如果要求精度更大,可以把100换成1000,然后加上0-999的随机数。

代码语言:javascript
复制
/**
* precision 精度 100 1000 10000 
*/
function getNumberUid(precision){
  const rawPre = (Date.now() - new Date(1624206802955).getTime()) / precision;
  const preNumber = Number(rawPre.toFixed()) * precision;
  const randam = Math.floor(Math.random() * precision);
  return preNumber + randam;
}

三、拓展

这种方式生成的数字仍然有非常小的概率重复,但是基本可以应对管理端环境的接口调用,保证不出现重复。如果是数据量非常大的唯一Id生成,还是需要使用数据库或者其他办法。例如可以参考廖雪峰老师的文章《分布式唯一ID生成器》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 一、数据库解决法
  • 二、利用时间戳
  • 三、拓展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档