2024-03-28 10:40:24 发布
网友
我试图为一些单元测试生成唯一的ID数字,我在某个地方看到了一个建议,比如:
def unique_id(): time.sleep(0.000001) # smallest precision for time.time() return time.time()
我想知道hash()调用是否总是至少需要0.000001,因此我可以使用:
如果我在一个单线程应用程序中连续调用同一个值,它会返回两次相同的值吗?在
编辑:加粗了“数字”这个词,因为每个人都忽略了它。在
埃文·福斯马克已经报道过了。在
但我想补充一下,Python的“hash”函数仅为32位或64位。我甚至不知道它是如何实现的,但我怀疑它是加密随机的。低质量哈希函数会发生冲突。在
如果需要唯一值,建议使用^{}库。 示例:
>>> import uuid >>> uuid.uuid4() UUID('514c2bd7-75a3-4541-9075-d66560f42b5c') >>> str(uuid.uuid4()) '6faad714-c2df-448b-b072-f91deb380e84'
如果只需要数字值,请使用^{}库。在
从Python提示符回答这个问题很简单:
>>> import time; print hash(time.time()) == hash(time.time()) True
(如果你看到False,你就真的很幸运了。)
False
所以,是的。现代计算机的速度很快,可以在不到0.000001秒的时间内散列一个浮点数。事实上,当我将其作为递增计数器的while循环编写时,似乎在我的机器上,Python可以获取时间并将其连续散列5000多次,而没有看到任何差异。不足为奇:哈希用于将对象拟合到哈希表(dictionary)中,因此其主要要求之一是速度。
while
在任何情况下,都不要求或保证hash()为每个对象返回一个唯一标识符。两个不同的time.time()(或任何类型)的值可以具有相同的哈希值,并且没有什么可以阻止这两个值通过某种定义“相邻”。在
hash()
time.time()
正如其他人所指出的,你想要的是UUID。不要重新发明轮子。如果你不能使用UUID,就使用一些永远不能复制的东西,比如计数器。在
埃文·福斯马克已经报道过了。在
但我想补充一下,Python的“hash”函数仅为32位或64位。我甚至不知道它是如何实现的,但我怀疑它是加密随机的。低质量哈希函数会发生冲突。在
如果需要唯一值,建议使用^{} 库。
示例:
如果只需要数字值,请使用^{} 库。在
^{pr2}$从Python提示符回答这个问题很简单:
(如果你看到
False
,你就真的很幸运了。)所以,是的。现代计算机的速度很快,可以在不到0.000001秒的时间内散列一个浮点数。事实上,当我将其作为递增计数器的
while
循环编写时,似乎在我的机器上,Python可以获取时间并将其连续散列5000多次,而没有看到任何差异。不足为奇:哈希用于将对象拟合到哈希表(dictionary)中,因此其主要要求之一是速度。在任何情况下,都不要求或保证
hash()
为每个对象返回一个唯一标识符。两个不同的time.time()
(或任何类型)的值可以具有相同的哈希值,并且没有什么可以阻止这两个值通过某种定义“相邻”。在正如其他人所指出的,你想要的是UUID。不要重新发明轮子。如果你不能使用UUID,就使用一些永远不能复制的东西,比如计数器。在
相关问题 更多 >
编程相关推荐