在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)
,但我确信有更优雅的方法可以解决这个问题。
建议?
答案 0 :(得分: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
答案 1 :(得分:3)
您至少有两种方法可以创建唯一标识符:
第一个选择是显而易见的:无论是在数据库层还是在应用程序层执行,您都需要存储最后生成的标识符的信息,这样您就可以通过递增来生成另一个标识符。
示例解决方案在这里:
>>> 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'
答案 2 :(得分:1)
如何将1添加到第一个,2添加到第二个?
我不太了解python,但是想法就是写
a = Foo(0)
b = Foo(1)
c = Foo(2)
并拥有类compute
unique_id = hashlib.sha1(str(time.time()+offset)).hexdigest()