2016-09-08 7 views
0

オブジェクトを取得し、そのオブジェクトを表すGUIDを取得したいと思います。オブジェクトをGUID/UUIDに変換

私はそれが多くのことを伴うことがわかります。私は一般的なアプリケーションのための十分なソリューションを探しています。

私の具体的な使用例はキャッシングのためのものです。私がキャッシングしているものを作成するために使用したオブジェクトが既に過去に作成されたことを知りたいと思います。 2種類のオブジェクトがあります。各タイプはパブリックプロパティのみを含み、リスト/ ienumableを含むことができます。

オブジェクトを仮定すると、私の最初のアイデアは、(ネイティブjsonserlizerまたはnewtonsoftを経由して)JSONにそれをシリアル化してからJSON文字列を取り、ここではその要旨How can I generate a GUID for a string?

のように詳細なUUIDバージョン5にそれを変換することでした、シリアライズ可能性があり

私の2番目のアプローチは、シリアル化できない場合(例えば、辞書が含まれている場合)、パブリックプロパティのリフレクションを使って一意の文字列を生成し、それをUUIDバージョン5に変換することです。

どちらのアプローチも、 5を指す文字列を取る。有効なuuid 5 guidを作成する実績のあるC#クラスはありますか?要点は良く見えますが、確信しています。

私はC#名前空間と型名をuuid5の名前空間にすることを考えていました。それは名前空間の有効な使用ですか?

私の最初のアプローチは、私のシンプルなユースケースには十分ですが、私はよりフレキシブルなので、2番目のアプローチを探求したいと思っていました。

guidを作成しても妥当な一意性が保証されない場合は、エラーが発生します。確かに超複雑なオブジェクトは失敗するでしょう。リフレクションを使用している場合は、どうすればよいのでしょうか?

私は新しいアプローチや懸念/実装を第2のアプローチに求めています。

+0

ような何かを試みることができますたとえば、MD5を使用することができます。 – Robert

+0

'GetHashCode'を探していませんか? https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx –

+0

@tomasハッシュコードは一意であることは保証されていませんが、うまくいけば衝突がありません。それらはまたそのオブジェクトタイプに固有です – ParoX

答えて

-1

他の人がコメントで述べたように、intをキーとして解決する場合はGetHashCodeのように聞こえるかもしれません。ない場合は、長さ16のbyte[]を取るGuidコンストラクタがあるあなたは何を意味する* *ハッシュと呼ばれている。以下

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

関連する問題