2010-03-12 24 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部分基於時間戳。這一切都是關於你的應用需求...

相關問題