決定論的ガイドを作成する方法 質問する

決定論的ガイドを作成する方法 質問する

私たちのアプリケーションでは、Guid 値を持つ属性を持つ XML ファイルを作成しています。この値は、ファイルのアップグレード間で一貫している必要があります。そのため、ファイル内の他のすべてが変更されたとしても、属性の GUID 値は同じままである必要があります。

1 つの明らかな解決策は、ファイル名とそれらに使用される GUID を含む静的辞書を作成することです。その後、ファイルを生成するたびに、ファイル名の辞書を検索し、対応する GUID を使用します。ただし、これは実現可能ではありません。ファイルが 100 個にまで拡張される可能性があり、大きな GUID リストを維持したくないからです。

そこで、別のアプローチとして、ファイルのパスに基づいて GUID を同じにするという方法があります。ファイル パスとアプリケーション ディレクトリ構造は一意であるため、そのパスに対して GUID も一意である必要があります。そのため、アップグレードを実行するたびに、ファイルはパスに基づいて同じ GUID を取得します。このような ' を生成するための優れた方法を 1 つ見つけました。決定論的ガイド(エルトン・ストーンマンに感謝します)。基本的には次のようになります。

private Guid GetDeterministicGuid(string input) 

{ 

//use MD5 hash to get a 16-byte hash of the string: 

MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); 

byte[] inputBytes = Encoding.Default.GetBytes(input); 

byte[] hashBytes = provider.ComputeHash(inputBytes); 

//generate a guid from the hash: 

Guid hashGuid = new Guid(hashBytes); 

return hashGuid; 

} 

したがって、文字列が指定されると、Guid は常に同じになります。

これを行うための他のアプローチまたは推奨される方法はありますか? その方法の長所と短所は何ですか?

ベストアンサー1

@bacarが述べたように、RFC 4122§4.3 では、名前ベースの UUID を作成する方法が定義されています。これを実行する利点 (MD5 ハッシュを使用するだけの場合と比較して) は、名前ベースでない UUID と衝突しないことが保証され、他の名前ベースの UUID と衝突する可能性が非常に (非常に) 低いことです。

.NET Frameworkにはこれらを作成するためのネイティブサポートがないので、NGuid パッケージアルゴリズムを実装します。次のように使用できます。

var guid = GuidHelpers.CreateFromName(GuidHelpers.UrlNamespace, filePath);

他の GUID との衝突のリスクをさらに減らすには、RFC で定義されている URL 名前空間 ID を使用する代わりに、名前空間 ID として使用するプライベート GUID を作成できます。

おすすめ記事