2017-03-16 188 views
0

我试图在名为myId的Mongodb文档中包含一个字段。我正在使用shortid。我想知道,在大数据的情况下,就像数以百万计的文档在一个集合:什么是shortid唯一性的保证?

  1. 什么是保证该shortid将永远独一无二的,永远不会被重复用于任何其他文件?
  2. 跟踪生成的ID是什么?
  3. id被重复的机会是多少?
+1

我假设这很可能'shortid'会创建重复的ID,但它可能发生。您应该在MongoDB的列中拥有唯一的索引,以确保您不能使用存在的ID插入记录。这样,如果插入失败,您可以生成一个新的ID并再次插入。 https://docs.mongodb.com/manual/core/index-unique/ – iamjpg

+0

来自shortid的npm-page:'默认7-14个友好的网址字符:AZ,az,0-9,_-'意味着介于2^42和2^85之间的可能组合;或作为小数点,最多可达26位数字中的数字(大约19000000000000000000000000种可能的组合)。有可能重复一次id:'应用程序可以重新启动任意次,而没有重复id的机会。'这是一个非常大胆的陈述。 **编辑:**在第一眼看到源码中的RNG后,我感到非常沮丧。必须检查如何使用这些。 – Thomas

回答

2

What's the guarantee that the shortid will be always unique and never ever be repeated for any other document

削减长话短说:这些shortids都非常简单,只是 “散列” 时间戳。不是unix时间戳,他们自己的品种,但不是时间戳。

所有那些随随便便都是这样,只是金光闪闪。

只要所有这些shortid是在同一台计算机(单个线程)上生成的,并且具有相同的种子,碰撞是不可能的。

跟踪生成的ID是什么?

当你请求id快时,计数器会增加,所以相同的时间戳被命中。一旦达到新的时间戳,该计数器就会重置为0。

没有什么重要的东西,那里真的是随机的。

id被重复的机会是多少?

使用过程中,很少到不存在。

据我所知道的,只有两件事情,可能导致碰撞是

  • 改变种子的PRNG(导致一个新的字母,让新的日期可能编码为已经使用不同种子生成的ID;尽管不太可能,但可能)

  • 由于计数器未同步而在多个线程/机器上生成ID。

摘要:我唠叨一下该代码几乎一切,但即使是这样,它的工作,可靠。我已经告诉你这些限制。

0

Shortid生成一个随机的64位id。这是在多个步骤中完成,但它的基础是这样的伪随机函数:

function getNextValue() { 
    seed = (seed * 9301 + 49297) % 233280; 
    return seed/(233280.0); 
} 

要两次生成相同的ID,该功能必须在相同的确切顺序在返回相同的精确值同样确切的第二个。这是非常罕见的,但如果他们重置计时器会发生(基于评论,他们这样做,但仍然很少见)。

+0

不,shortid会在单个ID中产生大约20位的随机性+ 40位可预测哈希。而且这两者甚至可以轻松区分和分离。其次,这个函数几乎与生成的id没有任何关系。它只用于洗字母(一次,在开始时)。除非你手动输入shortid,否则即使是乱码字母也是静态的,因为它总是使用相同的默认种子,并且这个函数总是以相同的顺序返回相同的值! – Thomas