首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MongoDB中生成唯一的8位组织ID?

如何在MongoDB中生成唯一的8位组织ID?
EN

Stack Overflow用户
提问于 2020-10-16 06:25:10
回答 2查看 394关注 0票数 0

我正在创建客户关系管理系统。我需要为特定客户端创建一个8位数字的唯一ID。如何在Java脚本和Mongo DB中实现这一点?

EN

回答 2

Stack Overflow用户

发布于 2020-10-16 07:57:03

如果没有更多关于用例的信息,就很难或不可能回答这个问题。

简单地说,您可以使用自动递增编号,这将为您提供一个最高可达99,999,999的唯一id。

但如果你想更进一步,你可以将其存储为26位结构,最高可达67108863的基数。

从那里你必须确定你的标识符的含义。

假设您计划有4台服务器可以存储标识符。

您可以将前2位设置为服务器id。因此服务器1将设置为00,服务器4将设置为11。

这样就只剩下24位来定义了。

所以现在你可以设置一些粒度...例如,将年份设置为YY格式,因为您可能不希望此应用程序存活到2100年之后。

6位可以让我们创建一个最多64位的数字,因此我们可以使用额外的位来计数到128位。

因此,2020年将是"001 0100“。

我们一年只有12个月的时间,所以可以分成4个部分。

十月是第十个月,所以数字9或二进制中的"1001“。

我们每个月最多有31天,所以5位就足够了

今天是这个月的第15天,所以数字14在二进制中是"01110“

到目前为止,我们每天使用18位来创建1个id,还剩下8位。

代码语言:javascript
运行
复制
server id | year   | month  | day   
2 bits    | 7 bits | 4 bits | 5 bits

有了9个剩余的位,你可以在4个不同的服务器上每天创建最多256个id,而不会有任何冲突的风险。

因此,如果您使用最大数量的id,则每天最多只能创建1024个id。它不是很多,但根据需要它可以足够好。

使用该方法,今天服务器0上的第一个id可能如下所示:

代码语言:javascript
运行
复制
00 | 001 0100 | 1001 | 0 1110 | 0 0000 0001

或以10为基数:"0539 7505“

因此,如果不了解您的需求,就不可能想出一个更好的有意义的标识符。显然,基于时间的方法大大减少了可以使用的位数。因为过去的日子是不能使用的ids,不幸的是,有了4个月的数据,数字13,14,15从未使用过,没有任何意义,只是永远列出。

在今年的情况下,我们甚至可以节省一点,并说我们将使用6位到64位,而不是7位,所以2020将是"00 0000“,所以你可以使用current year - 2020来找到正确的年份来放入id,如果这足够好的话,这将适用于2084年。

您可以使用任何可能有意义的内容来构建唯一标识符,而不是使用日期。如果使用随机数,不仅If没有意义,而且还有可能造成冲突。

最后,为什么不直接使用mongodb创建的ObjectId呢?它是一个唯一的标识符,它适合12位,所以你总是可以把它变成一个8位数字。

票数 1
EN

Stack Overflow用户

发布于 2020-10-16 07:08:03

首先,您需要知道只有8个数字的冲突可能性有点高,所以如果您不想要相同的if,则需要小心。

但是你可以用这个

代码语言:javascript
运行
复制
Math.floor(10000000 + Math.random() * 90000000)

我建议您使用UUID,但您更了解您的项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64380476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档