2011-02-28 50 views
11

是否有可能在一個應用程序是否有可能創造相同的GUID

Guid id = Guid.NewGuid(); 
+0

[看這個問題/答案](http://stackoverflow.com/questions/3004151/could-this-cause-multiple-identical-guids)。 – 2011-02-28 10:04:10

+0

它可以幫助你.. http://stackoverflow.com/questions/467271/how-random-is-system-guid-newguid http://stackoverflow.com/questions/300786/duplicate-returned-by-guid- newguid – Yuriy 2011-02-28 10:04:05

回答

14

技術上,是的。 A創建的Guid看起來例如是這樣的:

26de36b7-76f5-4f17-8f9d-44eb429f151b 

這意味着32個字符,其可以是字母(26點的可能性),或一個數字(10種可能性)

這意味着每個位置36個posibilities總共大約36^32。 60 000 000 000 000 000 000 000 000 000 000 000 000 000 000.

這意味着如果您創建2 000 000 000 000 000 000 000 000 000 000 GUID每個毫秒(這是不可能的) ,你將平均得到兩次創建的同一個GUID,其他所有GUID都是唯一的。

所以在實踐中。沒有;)

+1

是不是表示爲十六進制的GUID?如果是這樣,你沒有26個字母可供選擇,你有6. – 2013-04-05 20:59:33

+0

@CraigW。 - 這是一個很好的觀點:)這意味着數學是有點,但理論仍然是一樣的:有16種可能性,這意味着可能的GUID總數是3,4e38而不是6,33e49。仍然高得足以避免碰撞。 – 2013-04-08 10:02:29

-1

在U的GUID代表的獨特創造相同的GUID。 ;-)所以它不應該是可能的。

+4

但事實確實如此。不太可能,但仍然有可能。 – 2011-02-28 10:13:31

0

Guid.NewGuid()將始終在全球範圍內創建一個獨特的Guid,不僅在一個應用程序中。

+1

不再,請檢查規格。 Windows至少使用了GUID規範的V4,並且獨特的部分已被簡化爲單個系統。不太可能跨系統生成重複密鑰,但仍有可能。 – 2011-02-28 10:14:53

+0

的確,有一個理論上的機會...... – Olaf 2011-02-28 15:56:27

9

如果你問Guid.NewGuid()創建重複GUID的風險是否高,那麼答案是否定的。這是從Wikipedia採取:

一個GUID的值被表示爲一個32個字符的十六進制字符串,例如{21EC2020-3AEA-1069-A2DD-08002B30309D},並且通常存儲爲一個128位整數。唯一密鑰的總數是2128或3.4×1038--大約是地球整個體積的2萬億立方米。這個數字非常大,以致兩次產生相同數字的概率非常小。

如果你問我們如何創建兩個重複的GUID,那麼這就是答案:

Guid g1 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D"); 
Guid g2 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D"); 
1

Theoreticaly?是

是否實用?與創建兩個相同的GUID相比,您連續10次獲得彩票的機會更高,即使在單一應用程序中也是如此。

Simple proof that GUID is not unique

+1

事實上,你可能有更好的機會贏得每一週的彩票在你的餘生(如果可能性不大);) – 2011-02-28 10:11:34

-1

我其實只是有這種情況發生。我有一個包含7個項目的數據庫表。從我的程序中,我添加了一個新實例,使用Guid.NewGuid()作爲其ID。我得到一個DbUpdateException告訴我這個ID和現有的ID是一樣的。試了一遍,它工作正常。

+0

賠率非常小,你會看到一個衝突,我會尋找一個bug /線程問題而不是懷疑guid算法本身 - 請參閱[關於guid算法的這篇文章](http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx)。 – chris 2012-09-24 10:00:40

相關問題