在MongoDb中,新文档的自动分配ID(ObjectId)是唯一的,并且其内部包含其创建的时间戳。
如果不使用任何库(除了内置的Python库),我怎样才能创建这种简洁的唯一ID,它还能以某种方式保存其创建的时间戳?
答案 0 :(得分:2)
使用具有足够精度的纪元时间戳可能就足够了。将此与简单的用户ID相结合,您将拥有一个带有时间戳的唯一ID:
import time
epoch = time.time()
user_id = 42 # this could be incremental or even a uuid
unique_id = "%s_%d" % (user_id, epoch)
unique_id
现在的值类似于42_1526466157
。您可以使用此值并按_
字符拆分 - 现在您拥有创建时间的原始纪元(1526466157)。
答案 1 :(得分:2)
您可以使用datetime创建当前时间戳:
import datetime
datetime.datetime.now().strftime('%Y%m%d%H%M%S')
现在你可以用任何你想要的东西连接它。
如果您想添加微秒以确保它是唯一的,只需将%f
添加到结尾:
datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
答案 2 :(得分:2)
如果您使用的是多线程或多计算机方案,则所有选项都将关闭,并且如果仅使用时间戳,则不应依赖任何“额外级别的唯一保证”。从this excellent answer from deceze中了解更多信息。
类似于以上答案,另一种选择是连接时间戳和uuid:
from datetime import datetime
from uuid import uuid4
eventid = datetime.now().strftime('%Y%m-%d%H-%M%S-') + str(uuid4())
eventid
>>> '201902-0309-0347-3de72c98-4004-45ab-980f-658ab800ec5d'
eventid
包含56个字符,可能对您来说不成问题。但是,它保留了创建的时间戳,并且可以排序,所有这些在数据库中都是有利的,例如,您可以在两个时间戳之间查询eventid
。
答案 3 :(得分:-1)
您可以使用内置于标准库的UUID。具体来说,您可以使用uuid4
只是为了一点额外的安全性,因为它不会对计算机的网络地址进行编码。
import uuid
print(uuid.uuid4()) #56d36372-b5ec-4321-93b8-939ee7d780aa