我正在尝试为某些单元测试生成唯一ID 数字,我看到某个地方建议使用以下内容:
def unique_id():
time.sleep(0.000001) # smallest precision for time.time()
return time.time()
我想知道hash()调用是否总是至少需要0.000001,所以我可以使用:
def unique_id():
return hash(time.time())
如果我在单线程应用程序中连续调用它,那么它是否会返回相同的值两次?
编辑:用'NUMBERS'这个词加粗,因为每个人都忽略了它。
答案 0 :(得分:5)
如果您需要唯一值,建议您使用uuid
库。
例如:
>>> import uuid
>>> uuid.uuid4()
UUID('514c2bd7-75a3-4541-9075-d66560f42b5c')
>>> str(uuid.uuid4())
'6faad714-c2df-448b-b072-f91deb380e84'
如果您需要仅限数字的值,请使用random
库。
>>> import random
>>> INT_MAX = sys.maxint # Set INT_MAX to the max value for your given INT column
>>> random.randint(0, INT_MAX)
5188925271790705047
答案 1 :(得分:1)
从Python提示中回答这个问题很简单:
>>> import time; print hash(time.time()) == hash(time.time())
True
(如果你看到False
,你真的很幸运。)
所以,是的。现代计算机很容易快速地在0.000001秒内散列浮动。事实上,当我把它写成一个增加计数器的while
循环时,似乎在我的机器上,Python可以获得时间并连续散列它超过5000次而没有看到差异。不足为奇:哈希用于将对象拟合到哈希表(字典)中,因此其主要要求之一是速度。
在任何情况下,都没有要求或保证hash()
为每个对象返回唯一标识符。 time.time()
(或任何类型)的两个不同值可以具有相同的散列,并且没有什么可以阻止这两个值通过某种定义“相邻”。
正如其他人所指出的,你想要的是一个UUID。不要重新发明轮子。如果您不能使用UUID,请使用无法复制的内容,例如计数器。
答案 2 :(得分:1)
Evan Fosmark已经报道了它。
但我想补充一点,据我所知,Python的“哈希”函数只有32位或64位。我甚至不知道它是如何实现的,但我怀疑它是加密随机的。期望从低质量哈希函数发生冲突。