Python - 为什么不使用uuid4()生成唯一字符串?
我看到有很多人用不同的方法来生成独特的字符串,比如上传的图片名称、会话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,但看到它实际运行还是让人放心)。你甚至可以通过把两个uuid4()
组合起来来将概率减半。
那么,话说回来,为什么还有人花时间去用random()和其他方法来生成独特的字符串呢?uuid在安全性或其他方面有什么重要的问题吗?
6 个回答
6
一个可能的原因是你希望这个独特的字符串对人来说容易理解。UUID(通用唯一识别码)看起来就是不太容易读懂。
12
有时候,你可能希望能检测到重复的东西。如果有人上传了完全相同的图片两次,或许你更想告诉他们这是一张重复的图片,而不是单纯地再创建一个新名字的副本。
21
使用哈希值来唯一标识一个资源,可以从这个对象生成一个“独特”的引用。比如,Git就使用SHA哈希来生成一个独特的哈希值,这个哈希值代表了某次提交的具体变更。因为哈希是确定性的,所以每次对同一个文件进行哈希计算时,得到的哈希值都是一样的。
世界上两个不同的人可以独立地对同一个代码库做出相同的修改,而Git能够识别出他们做的是同样的改动。相比之下,UUID的版本1、2和4就做不到这一点,因为它们与文件或文件内容没有任何关系。