会散开(时间。时间())永远是唯一的

2024-03-28 10:40:24 发布

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

我试图为一些单元测试生成唯一的ID数字,我在某个地方看到了一个建议,比如:

def unique_id():
    time.sleep(0.000001) # smallest precision for time.time()
    return time.time()

我想知道hash()调用是否总是至少需要0.000001,因此我可以使用:

^{pr2}$

如果我在一个单线程应用程序中连续调用同一个值,它会返回两次相同的值吗?在

编辑:加粗了“数字”这个词,因为每个人都忽略了它。在


Tags: idforreturntimedef地方数字sleep
1条回答
网友
1楼 · 发布于 2024-03-28 10:40:24

埃文·福斯马克已经报道过了。在

但我想补充一下,Python的“hash”函数仅为32位或64位。我甚至不知道它是如何实现的,但我怀疑它是加密随机的。低质量哈希函数会发生冲突。在

网友
2楼 · 发布于 2024-03-28 10:40:24

如果需要唯一值,建议使用^{}库。 示例:

>>> import uuid
>>> uuid.uuid4()
UUID('514c2bd7-75a3-4541-9075-d66560f42b5c')
>>> str(uuid.uuid4())
'6faad714-c2df-448b-b072-f91deb380e84'

如果只需要数字值,请使用^{}库。在

^{pr2}$
网友
3楼 · 发布于 2024-03-28 10:40:24

从Python提示符回答这个问题很简单:

>>> import time; print hash(time.time()) == hash(time.time())
True

(如果你看到False,你就真的很幸运了。)

所以,是的。现代计算机的速度很快,可以在不到0.000001秒的时间内散列一个浮点数。事实上,当我将其作为递增计数器的while循环编写时,似乎在我的机器上,Python可以获取时间并将其连续散列5000多次,而没有看到任何差异。不足为奇:哈希用于将对象拟合到哈希表(dictionary)中,因此其主要要求之一是速度。

在任何情况下,都不要求或保证hash()为每个对象返回一个唯一标识符。两个不同的time.time()(或任何类型)的值可以具有相同的哈希值,并且没有什么可以阻止这两个值通过某种定义“相邻”。在

正如其他人所指出的,你想要的是UUID。不要重新发明轮子。如果你不能使用UUID,就使用一些永远不能复制的东西,比如计数器。在

相关问题 更多 >