为所有节点提供唯一的ID?

2024-09-27 00:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一个类,它将许多节点和边联系在一起。我还有其他操作,可以获取两个单独的对象并将它们合并为同一类型的单个对象,依此类推。在

但是,我需要一种方法给每个节点一个唯一的ID,以便于查找。我是否有适当的方式来增加一个外部的变量,或者说每次我都要把一个外部的ID加进去?在

我还考虑过在创建时为每个节点生成一个随机字符串,但是仍然存在冲突错误的风险(即使这个概率接近于零,它仍然存在,并且看起来像是一个设计缺陷,如果不是一个冗长的、过于工程化的方式来实现它的话)。在


Tags: 对象方法字符串id类型节点错误方式
3条回答

您可以保留一个类变量并将其用于序号ID:

class Node(object):
    _id = 0

    def __init__(self):
        self._id = Node._id
        Node._id += 1

它还有一个好处,您的类可以知道总共创建了多少个对象。在

这也比随机身份证便宜得多。在

如果您只需要一个唯一标识符,built-in Python ^{} function就可以:

Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

你的两个解决方案几乎都是在实践中完成的。在

您的第一个解决方案是只增加一个数字就可以给您唯一性,只要您不溢出(对于python bigintegers,这并不是真正的问题)。这种方法的缺点是,如果开始执行并发操作,则必须确保在增量和读取外部值时使用锁定来防止数据争用。在

另一种生成随机数的方法在并发情况下很好地工作。使用的位数越多,发生碰撞的可能性就越小。事实上,如果您使用128位作为标识,您几乎可以保证不会发生冲突

一种可以用来进一步保证不会发生冲突的方法是,使您的唯一id类似于TIMESTAMP_HASHEDMACHINENAME_PROCESSID/THREADID_UNIQUEID。除非在1秒内在同一进程/线程上生成两个相同的UNIQUEID,否则几乎不会发生冲突。MongoDB会这样做,只增加UNIQUEID。我不确定它们在溢出的情况下会做什么(我想在实践中这种情况不会经常发生)。一种解决方案可能是等到下一秒再生成更多的id。在

这可能是你想做的事情的过火,但这确实是一个有点有趣的问题。在

相关问题 更多 >

    热门问题