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

oro*_*aki 28 python uuid unique

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

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

>>> import uuid
>>> uuid.uuid4()
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d')
Run Code Online (Sandbox Code Playgroud)

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

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

不是一个中继器(我不认为现在考虑的可能性是1.108e + 50,但看到它在行动中是令人欣慰的).你甚至可以通过组合2 uuid4()秒来制作你的弦乐的一半.

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

Ari*_*ion 20

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

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

  • 应该选择UUIDv3或UUIDv5用于确定性事物(上传文件,git变更集等),并且应该选择UUIDv1,UUIDv2或UUIDv4用于瞬态,非确定性(会话,临时文件等). (13认同)

Ben*_*igt 12

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


Jas*_*ker 5

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