最近在做需求的时候,有个管理端接口需要在调用的时候传递一个无符号的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的随机数。
/**
* 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 删除。