Python-为什么要对唯一字符串使用uuid4()以外的任何东西?

Python-为什么要对唯一字符串使用uuid4()以外的任何东西?,python,unique,uuid,Python,Unique,Uuid,我看到了一些独特字符串生成的实现,比如上传的图像名称、会话ID等,其中许多都使用了hash,比如SHA1或其他 我不是在质疑使用这种定制方法的合法性,而是在质疑其原因。如果我想要一个唯一的字符串,我只说: >>> import uuid >>> uuid.uuid4() UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d') 我受够了。在读到uuid之前,我不是很信任,所以我这样做了: >>> import

我看到了一些独特字符串生成的实现,比如上传的图像名称、会话ID等,其中许多都使用了hash,比如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来生成字符串,从而降低一半的几率


那么,既然如此,为什么人们要花时间在random()和其他东西上,以获得唯一的字符串,等等?uuid是否存在重要的安全问题或其他问题?

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

好吧,有时候你需要冲突。如果有人上传了两次相同的图像,你可能更愿意告诉他们这是一个副本,而不是用一个新的名称复制另一个副本。

uuid很长,而且没有意义(例如,如果你按uuid排序,你会得到一个没有意义的结果)


而且,因为它太长了,我不想把它放在URL中,也不想以任何形状或形式向用户公开它。

使用散列来唯一地标识资源允许您从对象生成“唯一”引用。例如,Git使用SHA散列生成唯一的散列,该散列表示单个提交的确切变更集。因为散列是确定性的,所以每次都会为同一个文件得到相同的散列


世界各地的两个人可以独立地对同一回购协议进行相同的更改,Git知道他们进行了相同的更改。UUID v1、v2和v4不能支持这一点,因为它们与文件或文件内容没有任何关系。

除了其他答案之外,哈希对于应该是不可变的东西非常有用。该名称是唯一的,可用于随时检查它所附加到的任何对象的完整性。

还请注意,其他类型的UUID甚至可能是合适的。例如,如果您希望您的标识符是可排序的,那么UUID1部分基于时间戳。这完全是关于您的应用程序需求的…

@Ben,您是否可以将图像名称保存为行中的另一个字段,并使用编程逻辑覆盖现有图像,或者在再次上载相同图像时说“oops”。他的观点仍然有效:有时您需要冲突,而guid不提供冲突。话虽如此,任何使用SHA-1查找唯一字符串的人都可能犯了错误,因为其输出几乎肯定不如其输入唯一。@Ladendge我认为SHA-1是等式的一部分,只是为了生成一个更规范化的值(以防有空格等)。@orokusaki:生成图像名称,根据问题的第一行。那么,这将如何帮助您识别重复的内容,除非它是内容上的散列?这是我的DB行
[图像名称、图像文件名、其他一些\u字段,所以\u on和\u So\u on]
。如果我收到一个请求,用一个现有的
image\u名称
添加一个新图像,我只需找到匹配的
image\u文件名
,然后替换它。谁会在他们的记录系统中使用实际的图像文件名?我正在开发一个多租户架构,因此5000个客户端可能已经上传了
logo.jpg
。我不会仅仅依赖于为每个客户机创建单独的文件夹,因为如果我将文件系统更改为一些酷炫的新的类似S3的系统,我不想为每个客户机创建新的存储桶。这是一场噩梦。顺便说一句,uuid的长度加倍将使可能值的数量平方,而不仅仅是加倍。是的,但这就是目的。所有的熵,没有长度,反对!UUID实际上可以是确定性的!UUIDv3基于MD5散列,UUIDv5基于SHA-1散列。对于确定性的内容(上传的文件、git变更集等),应该选择UUIDv3或UUIDv5;对于暂时的、非确定性的内容(会话、临时文件等),应该选择UUIDv1、UUIDv2或UUIDv4。顺便说一句,git包括变更集中的作者信息和提交日期,所以不同的人所做的相同更改不会产生相同的散列。不过,保存在
.git
文件夹中的对象文件是一个有效的用例。