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

Javascript 如何在MongoDB中生成唯一的8位组织ID?,javascript,mongodb,customization,numeric,unique-id,Javascript,Mongodb,Customization,Numeric,Unique Id,我正在创建客户关系管理系统。我需要为特定的客户端创建一个8位数字的唯一ID。如何在使用Mongo DB的Java脚本中实现这一点?首先,您需要知道仅使用8个数字的冲突可能性有点高,因此如果您不希望使用相同的ID,则需要小心 但是你可以用这个 Math.floor(10000000 + Math.random() * 90000000) 我建议您使用UUID,但您对您的项目了解得更多。如果没有关于用例的更多信息,很难或不可能回答这个问题 简单地说,你可以使用一个自动递增的数字,这将给你一个唯一的

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

首先,您需要知道仅使用8个数字的冲突可能性有点高,因此如果您不希望使用相同的ID,则需要小心

但是你可以用这个

Math.floor(10000000 + Math.random() * 90000000)

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

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

简单地说,你可以使用一个自动递增的数字,这将给你一个唯一的id,最多9999999

但如果您想更进一步,您可以将其存储为26位结构,最多67108863,以10为基数

从这里,您必须确定标识符的含义

假设您计划有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为基数:“05397505”

因此,在不了解您的需求的情况下,就不可能找到一个更好的、有意义的标识符。显然,基于时间的方法大大减少了可使用的比特数。因为过去的日子是无法使用的ID,不幸的是,4位数据持续数月,数字13、14、15从未使用过,也没有任何意义,只是永远列出而已

在今年的情况下,我们甚至可以节省一点,用6位代替7位,最多64位,数字是
2020+number
,所以2020年是“00 0000”,所以你可以用
current year-2020
来找到正确的年份来输入id,如果足够好的话,最好是2084

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

最后,为什么不简单地使用mongodb创建的ObjectId呢?它是一个唯一的标识符,可容纳12位,因此您可以始终将其设置为8位数字