我看到退出了一些独特字符串生成的实现,例如上传的图像名称,会话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是否存在重要的安全问题?
答案 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部分基于时间戳。这完全取决于您的应用程序要求......