在Python中基于日期创建唯一ID

时间:2018-05-16 10:14:21

标签: python python-3.x

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

如果不使用任何库(除了内置的Python库),我怎样才能创建这种简洁的唯一ID,它还能以某种方式保存其创建的时间戳?

4 个答案:

答案 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