IDに依存しないデータ型(基本的には、すべての可能なIDを1つの列に含めるためにの「グローバルに一意」の部分を利用した古いコード)で使用するために、新しく移行int
されたID値を型に格納するという従来の要件があります。 /分野)。guid
guid
guid
この要件のために、人間が読める形式でエンティティの整数IDを埋め込むという後続の要件がありました。これは重要であり、現在、バイト値に対して直接作業することを妨げている原因です。
現在、私は次のものを持っています:
public static byte[] IntAsHexBytes(int value)
{
return BitConverter.GetBytes(Convert.ToInt64(value.ToString(), 16));
}
public static Guid EmbedInteger(int id)
{
var ib = IntAsHexBytes(id);
return new Guid(new byte[]
{
0,0,0,0,0,0,1,64,ib[7],ib[6],ib[5],ib[4],ib[3],ib[2],ib[1],ib[0]
});
}
の視覚的表現をint
16進値( )として扱い、それを(value.ToString()
)に変換し、特定の構造でを作成するために、からバイトをフラット化して取得します。long
Convert.ToInt64(value.ToString(), 16)
long
byte[]
guid
したがって、42が与えられたint
場合、42を16進数として扱い、それを1に変換するとlong
、66が得られ、66のバイトに変換すると、次のようになりguid
ます。
"00000000-0000-4001-0000-000000000042"
そして、int
のは379932126
与える:
"00000000-0000-4001-0000-000379932126"
したがって、最終結果は、整数をguid
最後の12桁に配置して、視覚的に整数42のように見えるようにします(基になる整数値が66であったとしても)。
これは、コンストラクターにフィードするために連結を使用して文字列を作成するよりも約30%〜40%高速new Guid(string)
ですが、そもそも文字列を使用する必要がないという解決策が欠けていると感じています。
関係する実際のタイミングは非常に小さいので、パフォーマンスの向上として、おそらく努力を正当化することはできません。
これは純粋に、この問題に取り組むより速い方法があるかどうかを確認するための私自身の好奇心のためです。私は長年のSOユーザーであるため、ここに投稿しましたが、これがコードレビューのような質問であるかどうかについては悩んでいます。コードに対して直接何も求めていませんが、それは私が何を示しているかを示しています。出力として欲しい。
提供される整数範囲は0からint.MaxValue
。です。
更新:完全を期すために、これは私たちが現在持っているものであり、私がテストしているものです:
string s = string.Format("00000000-0000-4001-0000-{0:D12}", id);
return new Guid(s);
上記の他のコードは、これよりも約30%高速です。