Python - 为什么使用除uuid4()之外的任何东西来获取唯一字符串?

时间:2010-03-12 18:35:42

标签: python unique uuid

我看到退出了一些独特字符串生成的实现,例如上传的图像名称,会话ID等等,其中许多都使用了SHA1等哈希的使用。

我并不质疑使用这样的自定义方法的合法性,而只是原因。如果我想要一个独特的字符串,我只想说:

>>> import uuid
>>> uuid.uuid4()
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d')

我已经完成了它。在我读到uuid之前,我并不是很信任,所以我这样做了:

>>> import uuid
>>> s = set()
>>> for i in range(5000000):  # That's 5 million!
>>>     s.add(str(uuid.uuid4()))
...
...
>>> len(s)
5000000

不是一个中继器(我不认为现在考虑的可能性是1.108e + 50,但看到它在行动中是令人欣慰的)。你甚至可以通过组合2 uuid4() s来制作你的字符串来获得一半的赔率。

所以,说到这一点,为什么人们花时间在随机()和其他东西上寻找独特的字符串等?关于uuid是否存在重要的安全问题?

6 个答案:

答案 0 :(得分:20)

使用哈希来唯一标识资源允许您从对象生成“唯一”引用。例如,Git使用SHA散列来创建一个唯一的散列,表示单个提交的确切变更集。由于散列是确定性的,因此每次都会为同一个文件获取相同的散列值。

世界上有两个人可以独立对同一个回购做同样的改变,Git会知道他们做了同样的改变。 UUID v1,v2和v4不支持,因为它们与文件或文件的内容无关。

答案 1 :(得分:12)

好吧,有时你想要碰撞。如果有人上传了相同的图像两次,也许您宁愿告诉他们这是重复的,而不是仅仅使用新名称制作另一个副本。

答案 2 :(得分:5)

一个可能的原因是您希望唯一字符串是人类可读的。 UUID只是不容易阅读。

答案 3 :(得分:3)

uuids很长,没有意义(例如,如果你通过uuid订购,你会得到毫无意义的结果)。

而且,因为它太长了,我不想把它放在一个URL中,或者以任何形式或形式将它暴露给用户。

答案 4 :(得分:1)

除了其他答案之外,哈希对于那些应该是不可变的东西真的很好。该名称是唯一的,可以随时用于检查所附件的完整性。

答案 5 :(得分:1)

另请注意,其他类型的UUID甚至可能是合适的。例如,如果您希望标识符可订购,则UUID1部分基于时间戳。这完全取决于您的应用程序要求......