我正在创建客户关系管理系统。我需要为特定客户端创建一个8位数字的唯一ID。如何在Java脚本和Mongo DB中实现这一点?
发布于 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位。
server id | year | month | day
2 bits | 7 bits | 4 bits | 5 bits
有了9个剩余的位,你可以在4个不同的服务器上每天创建最多256个id,而不会有任何冲突的风险。
因此,如果您使用最大数量的id,则每天最多只能创建1024个id。它不是很多,但根据需要它可以足够好。
使用该方法,今天服务器0上的第一个id可能如下所示:
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位数字。
发布于 2020-10-16 07:08:03
首先,您需要知道只有8个数字的冲突可能性有点高,所以如果您不想要相同的if,则需要小心。
但是你可以用这个
Math.floor(10000000 + Math.random() * 90000000)
我建议您使用UUID,但您更了解您的项目。
https://stackoverflow.com/questions/64380476
复制相似问题