hash(time.time())总是唯一的

时间:2015-12-17 21:46:25

标签: python time hash

我正在尝试为某些单元测试生成唯一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'这个词加粗,因为每个人都忽略了它。

3 个答案:

答案 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位。我甚至不知道它是如何实现的,但我怀疑它是加密随机的。期望从低质量哈希函数发生冲突。