2016-05-15 80 views
0

我有一個關於Guid作爲生成ID的方法的問題。我需要能夠爲給定類的每個實例生成一個新的唯一ID(我預計會有幾百個實例)。我包括我下面的代碼:使用C#中的Guid生成實例的唯一ID

class Program 
{ 
    static void Main(string[] args) 
    { 
     Instance instance1 = new Instance(); 
     Console.WriteLine(instance1.ID); 
     Instance instance2 = new Instance(); 
     Console.WriteLine(instance2.ID); 
     Console.ReadKey(); 
    } 
} 
public static class GenerateID 
{ 
    public static string NewID() 
    { 
     Guid guid = Guid.NewGuid(); 
     string id = guid.ToString(); 
     return id; 
    } 
} 
public class Instance 
{ 
    public string ID = GenerateID.NewID(); 
} 

從我所看到的,這種方法可行,並且兩個獨特的ID是,當我運行的代碼都會產生,但我不能夠進行廣泛的測試這一點,因爲我讀到Guid能夠產生像一個ID的badgilion。

我實施上述方式確保ID是每次都是唯一的?或者有沒有碰撞的機會?如果是這樣,將實例分配唯一ID的更好方法是什麼?

編輯:好的,所以我從ppl的答案中學到了Guid本質上並不是100%獨特的(謝謝,我會確保詳細閱讀),但是我的問題是我用來獲取ID的方法可能會提高產生相同兩個ID的機會?或者,這是獲取唯一ID的好方法嗎?

+1

這種關於GUID衝突的愚蠢行爲非常不利。真正的問題是你沒有考慮廉價的解決方案。獲得一個新的ID是微不足道的,比前一個更好。 40億已經是一個龐大的數字,但使用*長*來存儲它,無論你嘗試多麼努力,你都無法在194年內獲得重複。無論您需要使用'++'還是Interlocked.Increment()來使其線程安全,都取決於您。 –

回答

2

Guid.NewGuid()是使用MSDN的單詞「非常高的確定性」,獨一無二的。

的.NET調用調用WIN32的CoCreateGuid()(這就要求UuidCreate),其言論載列如下:

MSDN:

到一個很高的確定性,這個函數返回一個獨特的價值 - 沒有其他調用,在相同或任何其他系統(聯網與否),應返回相同的值 - Golly, tell me more

0

您生成的每個GUID都包含由2^128個數字組成的32位十六進制數字序列!所以獲得重複GUID的機會幾乎爲零。考慮到由128位隨機數組成的GUID,即使您同時生成重複GUID,也可以將重複GUID設置爲零。