独特的SHA1消化代

2024-04-25 22:11:56 发布

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

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

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

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

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

^{pr2}$

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

我在对象创建之间使用了一个sleep(0.1),但我相信有更优雅的方法来解决这个问题。在

建议?在


Tags: 对象方法selfidobjectfootimeinit
3条回答

Python对象已经有一个唯一的标识符,即它们的id。但是,只要对象仍然存在,这是唯一的;对象被删除后,id可以被重用。在

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

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

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

  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安装捆绑在一起,您可以使用它来执行以下操作:

^{pr2}$

将它们转换成散列

如果需要,可以将这两个值转换为SHA-1哈希值:

>>> import hashlib
>>> hashlib.sha1(str(1)).hexdigest()
'356a192b7913b04c54574d18c28d46e6395428ab'
>>> hashlib.sha1('0baa65ea-b665-11e1-b721-b80305056d6a').hexdigest()
'46bd64c5f4a81b90539d7302d030e01378ef6d6e'

第一个和第二个加起来怎么样?在

我对python的了解还不足以修复它,但我的想法是编写

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

让全班同学计算

^{pr2}$

相关问题 更多 >