2010-03-12 30 views
26

我看到退出了一些像上传的图像名称,会话ID等等的东西的唯一字符串生成的实现,并且其中许多实现了诸如SHA1之类的散列的使用。Python - 为什么使用除uuid4()以外的其他任何字符作为唯一字符串?

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

>>> 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的重要安全问题或其他问题?

+11

顺便说一句,加倍uuid的长度将平方可能值的数量,而不是双倍。 – 2010-03-12 18:49:27

回答

19

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

世界各地的两个人可以独立地对相同的回购进行相同的更改,Git会知道他们也做出了相同的更改。由于UUID v1,v2和v4与文件或文件内容无关,因此无法支持该功能。

+1

异议! UUID实际上可以是确定性的! UUIDv3基于MD5散列,而UUIDv5基于SHA-1散列。 – starlocke 2013-10-28 19:20:33

+13

应该为确定性事物(上传的文件,git变更集等)选择UUIDv3或UUIDv5,并且应该为瞬态,非确定性(会话,临时文件等)选择UUIDv1,UUIDv2或UUIDv4。 – starlocke 2013-10-28 19:22:35

+0

BTW git包含作者信息和更改集中的提交日期,因此不同人的相同更改不会生成相同的散列。尽管保存在'.git'文件夹中的目标文件是一个有效的用例。 – 2015-07-29 08:39:27

5

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

11

那么,有时你想碰撞。如果有人两次上传相同的确切图像,也许你宁愿告诉他们这是一个副本,而不是用另一个新名称复制副本。

+0

@Ben,难道你只是将图像名称保存为行中的另一个字段,并且使用编程逻辑覆盖现有图像,或者当他们再次上传同一图像时说“oops”。 – orokusaki 2010-03-12 18:40:12

+0

他的观点仍然有效:有时你想碰撞,而GUID不提供它们。 话虽如此,任何使用SHA-1查找* unique *字符串的人都可能做错了什么,因为它的输出几乎肯定比输入少。 – ladenedge 2010-03-12 18:47:13

+0

@ladenedge我认为SHA1是方程的一部分,只是为了做一个更规范化的值(如果有空格等)。 – orokusaki 2010-03-12 19:11:11

3

uuids很长,也没有意义(例如,如果你用uuid命令,你会得到一个毫无意义的结果)。

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

+1

是的,但这就是[shortuuid](https://github.com/stochastic-technologies/shortuuid)的用途。所有的熵,都不是长久的。 – 2013-05-08 12:59:09

1

除了其他答案之外,哈希对于那些应该是不可变的事情来说真的很好。该名称是独一无二的,可用于随时检查它所附带的任何内容的完整性。

1

另请注意,其他种类的UUID甚至可能适用。例如,如果您希望您的标识符是可订购的,则UUID1部分基于时间戳。这一切都是关于你的应用需求...

相关问题