2016-09-08 26 views
0

我想採取任何對象,並獲取代表該對象的GUID。對象GUID/UUID

我知道這需要很多東西。我正在尋找適合常見應用程序的足夠好的解決方案。

我的具體用例是用於緩存,我想知道用於創建我緩存的對象過去已經創建了一個。會有2種不同類型的對象。每種類型只包含公共屬性,並且可能包含一個列表/可自定義的列表。

假設對象可以是序列化我的第一個想法是把它序列化到JSON(通過本地jsonserlizer或newtonsoft),然後採取JSON字符串,將其轉換成5 UUID的版本在這裏要點How can I generate a GUID for a string?

儘可能詳細

我的第二種方法,如果它不是可序列化的(例如包含字典),將使用公共屬性上的反射來生成某種唯一字符串,然後將其轉換爲uuid版本5.

這兩種方法都使用uuid版本5採取一個字符串來引導。有沒有一個經過驗證的c#類可以生成有效的uuid 5 guid?要點看起來不錯,但要確定。

我正在考慮讓c#命名空間和類型名稱成爲uuid的命名空間5.是否有效地使用命名空間?

我的第一種方法足以滿足我的簡單用例,但我想探索第二種方法,因爲它更靈活。

如果創建guid不能保證合理的唯一性,它應該拋出一個錯誤。超級複雜的物體肯定會失敗。如果使用反射,我怎麼會知道這種情況?

我正在尋找新的方法或關注/實現第二種方法。

+0

你的意思是被稱爲*哈希什麼*。例如,您可以使用MD5。 – Robert

+0

你不是在找'GetHashCode'嗎? https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx –

+0

@tomas哈希代碼不保證是唯一的,只是希望無衝突。它們也特定於該對象類型 – ParoX

回答

-1

正如其他人在評論中所說的,聽起來像GetHashCode可能會爲你做詭計,如果你願意解決作爲你的鑰匙int。如果不是,有一個Guid構造函數,長度爲16 byte[]你可以嘗試喜歡的東西下面

using System.Linq; 
class Foo 
{ 
    public int A { get; set; } 
    public char B { get; set; } 
    public string C { get; set; } 
    public Guid GetGuid() 
    { 
     byte[] aBytes = BitConverter.GetBytes(A); 
     byte[] bBytes = BitConverter.GetBytes(B); 
     byte[] cBytes = BitConverter.GetBytes(C); 
     byte[] padding = new byte[16]; 
     byte[] allBytes = 
      aBytes 
       .Concat(bBytes) 
       .Concat(cBytes) 
       .Concat(padding) 
       .Take(16) 
       .ToArray(); 
     return new Guid(allBytes); 
    } 
} 
+0

這對這個班級來說是特別的。我想通過反射來獲取字節可能是一個棘手的問題。哈希碼也不保證是唯一的,它不是全局的。 A類哈希碼可能與B類相同 – ParoX