重复执行程序是否会增加唯一 ID 冲突的可能性
Do repeated program executions increase chance of unique ID collisions
我知道唯一 ID 生成器(如 UUID 和 nanoid)的要点是,在很长很长时间内不应该发生碰撞。但是程序的后续重新执行会增加机会吗?
示例:
(我对 RNG 或 UUID 了解不多,所以这可能无法完全反映整个过程,但这个例子将解释我为什么要问这个问题)
第一次执行:nanoid 被初始化为 0 的种子。它将产生的 id 链将是 A、B、C、D...等。并且我们在这个特定的链中很长一段时间都不会再看到 A、B、C,所以在这个程序执行期间,没有什么可担心的。
后续执行:nanoid 以 0 种子初始化将是一个明显的问题,但即使它不相同,我假设从种子生成的元素并不是该种子独有的。
- 种子 0 -> A,B,C,D......
- 种子 1 -> W,X,Y,Z.....A...B,C
所以即使选择了不同的种子,在某些时候仍然有可能达到相同的 ID。
我的想法对吗,这值得担心吗?
回答标题中的问题:也许,也许不是。
这取决于某些事情:
- 程序会检查它生成的 ID 的唯一性吗?
- 程序是否从固定种子开始生成 ID?
- ID中使用了哪些类型的数字?它们是伪随机数吗?它们是时间戳吗?它们是序号吗?它们是从加密 RNG 生成的吗?
- 如果数字是伪随机数,程序是如何初始化 PRNG 的?用固定种子?使用粗略的时间戳?使用 high-resolution 时间戳?使用加密随机数?
碰撞值得担心吗?也许吧,如果您的应用程序不能容忍程序生成重复 ID 的风险。
我知道唯一 ID 生成器(如 UUID 和 nanoid)的要点是,在很长很长时间内不应该发生碰撞。但是程序的后续重新执行会增加机会吗?
示例: (我对 RNG 或 UUID 了解不多,所以这可能无法完全反映整个过程,但这个例子将解释我为什么要问这个问题)
第一次执行:nanoid 被初始化为 0 的种子。它将产生的 id 链将是 A、B、C、D...等。并且我们在这个特定的链中很长一段时间都不会再看到 A、B、C,所以在这个程序执行期间,没有什么可担心的。
后续执行:nanoid 以 0 种子初始化将是一个明显的问题,但即使它不相同,我假设从种子生成的元素并不是该种子独有的。
- 种子 0 -> A,B,C,D......
- 种子 1 -> W,X,Y,Z.....A...B,C
所以即使选择了不同的种子,在某些时候仍然有可能达到相同的 ID。
我的想法对吗,这值得担心吗?
回答标题中的问题:也许,也许不是。
这取决于某些事情:
- 程序会检查它生成的 ID 的唯一性吗?
- 程序是否从固定种子开始生成 ID?
- ID中使用了哪些类型的数字?它们是伪随机数吗?它们是时间戳吗?它们是序号吗?它们是从加密 RNG 生成的吗?
- 如果数字是伪随机数,程序是如何初始化 PRNG 的?用固定种子?使用粗略的时间戳?使用 high-resolution 时间戳?使用加密随机数?
碰撞值得担心吗?也许吧,如果您的应用程序不能容忍程序生成重复 ID 的风险。