[英]How to create a unique ID in a Python Class across multiple processes
我想编写一个对象,该对象在实例化时为每个实例生成一个新的ID。 但是,此ID必须为
一些无关紧要的问题:
已经有一些解决方案仅在一个过程中起作用,最优雅的解决方案是使用itertools.count()
对象。 使用id()
是没有选择的,因为它不能保证唯一。 理想的解决方案可能是与itertools.count()
类似的对象,该对象在进程之间拥有一些静态全局值。
关于我们项目的相关讨论: https : //github.com/coala-analyzer/coala/issues/981
根据@VPfB的建议,使用UUID 。 UUID是通用唯一标识符的缩写。 从技术上讲,这些ID只能与用于存储它们的可用位空间一样唯一。 传统上,UUID是128位。 有关该主题的Wikipedia文章讨论了它们的独特性 :
为了正确理解这些数字,估计某人被陨石击中的年风险是170亿的一次机会,这意味着该概率约为0.00000000006(6×10-11),等于创造机会的几率。一年中有数十万亿个UUID,并且有一个重复项。 换句话说, 只有在接下来的100年中每秒生成10亿个UUID之后 , 才创建一个副本的可能性约为50%。
一种替代解决方案是使用专用系统来生成序列(类似于生成主键的数据库)。 该系统实质上是防弹计数器。 当某些东西需要一个ID时,它将向系统查询下一个可用ID。 当系统收到对新ID的查询时,它将增加计数器并提供新值。 这样安排的目的是,更新计数器,获取新值并存储当前状态(针对诸如电源故障之类的问题)的动作是原子性的。
例如在连接不良的分布式系统的情况下,计数器系统的想法可能不切实际。 这是需要UUID的主要情况:在多个不同的,未连接的系统中生成ID的能力非常高,不会发生冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.