为所有节点提供唯一ID?

时间:2015-06-01 18:46:45

标签: python class tree nodes

我在Python中创建了一个将很多节点和边缘连接在一起的类。我还有其他操作可以采用两个单独的对象并将它们合并到一个相同类型的单个对象中,依此类推。

但是,我需要一种方法为每个节点提供一个唯一的ID,以便于查找。有没有“正确的方法”来做到这一点,或者我只需要保留一个外部ID变量,我每次向任何对象添加更多节点时都会增加并传入我的类方法?

我还考虑过在创建时为每个节点生成一个随机字符串,但仍然存在碰撞错误的风险(即使这个概率接近于零,它仍然存在并且看起来像一个设计缺陷,如果不是一个长期的过度工程无论如何都要这样做。)

4 个答案:

答案 0 :(得分:3)

如果您只需要一个唯一标识符,built-in Python id() function就可以执行此操作:

  

返回对象的“标识”。这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的。具有非重叠生存期的两个对象可能具有相同的id()值。

答案 1 :(得分:1)

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

class Node(object):
    _id = 0

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

它还有一个好处,即您的班级将能够知道完全创建了多少个对象。

这也比随机ID便宜。

答案 2 :(得分:0)

几乎所有的解决方案都是在实践中所做的。

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

生成随机数的另一种方法在并发情况下运行良好。您使用的位数越多,遇到碰撞的可能性就越小。事实上,如果你的id为128位,那么你几乎可以保证不会发生冲突。

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

对于你想要做的事情来说,这可能有点过头了,但这确实是一个有点有趣的问题。

答案 3 :(得分:0)

UUID对这类事情有好处。

>>> from uuid import uuid4
>>> uuid4().hex
'461dd72c63db4ae9a969978daadc59f0'

通用唯一ID具有非常低的冲突率 - 除非您创建数十亿个节点,否则它应该可以解决问题。