2

在 Python 中,我创建了 3 个对象,每个对象都有一个唯一标识符。

我在所有这些对象中生成这个唯一标识符的方式如下:

class Foo(object):
    def __init__(self):
        unique_id = hashlib.sha1(str(time.time())).hexdigest()

我像这样一个接一个地创建这些对象:

a = Foo()
b = Foo()
c = Foo()

所有这些实例最终都具有相同的结果,unique_id因为它们的创建之间没有足够的时间间隔。

我已经求助于在对象创建之间放置一个sleep(0.1),但我确信有更优雅的方法来解决这个问题。

建议?

4

3 回答 3

5

Python 对象已经有一个唯一标识符,即它们的id. 不过,这只有在对象存在时才是唯一的;删除对象后id可以重用。

您还可以使用uuid标准库中的模块,或者只在类中保留一个计数器:

class Foo(object):
    __COUNT = 0
    # or: __COUNT = random.randint(0, 2**N - 1)

    def __init__(self):
        self.unique_id = self.__COUNT  # or take the SHA1 of the count
        type(self).__COUNT += 1
于 2012-06-14T20:56:46.453 回答
3

您至少有两种方法可以创建唯一标识符:

  1. 使用增量值(通常是整数)来生成唯一键
  2. 使用例如。UUID(通用唯一标识符)

增量标识符

第一个选择很明显:无论是在数据库层还是在应用程序层,都需要存储最后生成的标识符的信息,这样就可以通过递增来生成另一个标识符。

示例解决方案在这里:

>>> class Incremental(object):
    _last_id = 0
    def __init__(self):
        Incremental._last_id += 1
        self.id = Incremental._last_id


>>> class MyClass(Incremental):
    def __repr__(self):
        return 'MyClass with id=%s' % self.id


>>> a = MyClass()
>>> b = MyClass()
>>> c = MyClass()
>>> a, b, c
(MyClass with id=1, MyClass with id=2, MyClass with id=3)

虽然看看其他人提出的建议 - 他们的建议可能更适合增量 ID。

通用唯一标识符

第二种选择只是使用适当的工具来完成适当的任务:UUID 专门设计用于为您提供唯一标识符。

有一个名为UUID的模块与标准 Python 安装捆绑在一起,您可以使用它:

>>> import uuid
>>> str(uuid.uuid1())
'0baa65ea-b665-11e1-b721-b80305056d6a'

将它们翻译成哈希

如果您愿意,可以将这两个值转换为 SHA-1 哈希:

>>> import hashlib
>>> hashlib.sha1(str(1)).hexdigest()
'356a192b7913b04c54574d18c28d46e6395428ab'
>>> hashlib.sha1('0baa65ea-b665-11e1-b721-b80305056d6a').hexdigest()
'46bd64c5f4a81b90539d7302d030e01378ef6d6e'
于 2012-06-14T21:06:05.057 回答
1

第一个加 1,第二个加 2 怎么样?

我不太了解python来修复它,但我的想法是写

a = Foo(0)
b = Foo(1)
c = Foo(2)

并让班级计算

unique_id = hashlib.sha1(str(time.time()+offset)).hexdigest()
于 2012-06-14T20:57:16.310 回答