0

我知道像 UUID 和 nanoid 这样的唯一 id 生成器的意义在于,碰撞不应该在很长一段时间内发生。但是随后重新执行程序会增加机会吗?

示例:(我对 RNG 或 UUID 了解不多,因此这可能无法完全反映该过程,但此示例将解释我问这个问题的原因)

第一次执行: nanoid 使用种子 0 进行初始化。它将产生的 id 链将是 A、B、C、D...等。而且我们在这个特定的链中很长一段时间都不会再看到 A、B、C,所以在这个程序执行期间,没有什么可担心的。

随后的执行:使用 0 种子初始化 nanoid 将是一个明显的问题,但即使它不一样,我假设从种子生成的元素并不是该种子独有的。

  • 种子 0 -> A,B,C,D......
  • 种子 1 -> W,X,Y,Z.....A...B,C

因此,即使选择了不同的种子,在某些时候仍然可以达到相同的 ID。

我的想法是否正确,这值得担心吗?

4

1 回答 1

0

回答标题中的问题:也许,也许不是。

这取决于某些事情:

  • 程序是否检查它生成的 ID 的唯一性?
  • 程序是否从固定种子开始生成 ID?
  • ID 中使用了哪些类型的数字?它们是伪随机数吗?它们是时间戳吗?它们是序号吗?它们是从加密的 RNG 生成的吗?
  • 如果数字是伪随机的,程序是如何初始化 PRNG 的?有固定的种子?带有粗略的时间戳?带有高分辨率时间戳?使用加密随机数?

碰撞值得担心吗?也许,如果您的应用程序不能容忍程序生成重复 ID 的风险。

于 2020-10-19T20:23:34.780 回答