我想编写一个对象,在实例化时,为每个实例生成一个新ID。但是这个ID必须是
一些不关心的问题:
已经有一些解决方案仅适用于one process,最优雅的是使用itertools.count()
对象。使用id()
是不可取的,因为它不能保证是唯一的。理想的解决方案可能是与itertools.count()
类似的对象,它在整个流程中保留一些静态全局值。
关于我们项目的相关讨论:https://github.com/coala-analyzer/coala/issues/981
答案 0 :(得分:1)
根据@VPfB的建议,使用UUID。 UUID是Universally Unique Identifier的首字母缩写。从技术上讲,id只能与用于存储它们的可用位空间一样唯一。传统上UUID是128位。 Wikipedia article on the topic discusses their uniqueness:
为了正确看待这些数字,一个特定人被陨石击中的年风险估计为170亿的一次机会,这意味着概率约为0.00000000006(6×10-11),相当于在一年内创造几十万亿UUID并且有一个重复的可能性。换句话说,只有在接下来的100年中每秒生成10亿UUID后,创建一个副本的概率大约为50%。
另一种解决方案是使用专用系统生成序列(类似于生成主键的数据库)。该系统基本上是一个防弹计数器。当某些东西需要ID时,它会向系统查询下一个可用ID。当系统收到新ID的查询时,它会递增计数器并提供新值。它将被安排成更新计数器,获取新值以及存储当前状态(针对诸如电源故障等问题)的行为是原子的。
计数器系统的想法可能不实用,例如在连接不良的分布式系统的情况下。这是需要UUID的主要情况:能够在多个不同的,未连接的系统中生成ID,并且具有非常高的概率,即不会发生冲突。