根据日期在Python中创建唯一的ID

Jun*_*ius 2 python python-3.x

在MongoDb中,为新文档自动分配的ID(ObjectId)是唯一的,并且在其内部包含其创建的时间戳。

在不使用任何库(Python的内置库除外)的情况下,如何创建这种简洁的唯一ID(又以某种方式保留其创建时间戳)?

Lix*_*Lix 7

使用具有足够精度的纪元时间戳可能对您来说就足够了。将其与简单的用户 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)
Run Code Online (Sandbox Code Playgroud)

unique_id现在将具有类似于 的值42_1526466157。您可以获取该值并按字符拆分它_- 现在您拥有创建时间的原始纪元(1526466157)。


zip*_*ipa 5

您可以使用datetime创建当前时间戳:

import datetime
datetime.datetime.now().strftime('%Y%m%d%H%M%S')
Run Code Online (Sandbox Code Playgroud)

现在你可以将它与你想要的任何东西连接起来。

如果你想添加微秒以确保它是唯一的,只需添加%f到最后:

datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
Run Code Online (Sandbox Code Playgroud)


sed*_*deh 5

如果您使用的是多线程或多计算机的方案,那么所有赌注都将关闭,并且如果仅使用时间戳,则不应依赖任何“额外级别的唯一保证”。阅读更多有关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'
Run Code Online (Sandbox Code Playgroud)

eventid包含56个字符,可能对您来说不成问题。但是,它具有创建的时间戳,并且可以排序,所有这些在数据库中都是有利的,例如,允许您eventid在两个时间戳之间进行查询。