私はC#に変換した以下のt-sqlコードを持っています。変換されたguid
DECLARE @guidRegular UNIQUEIDENTIFIER, @dtmNow DATETIME
SELECT @guidRegular = '{5bf8e554-8dbc-4008-9d48-5c6e0a4d28d7}'
SELECT @dtmNow = '2012-02-09 18:31:38'
print (CAST(CAST(@guidRegular AS BINARY(10)) + CAST(@dtmNow AS BINARY(6)) AS UNIQUEIDENTIFIER))
私は(同じGUIDと日時を使用して)、コードの.NETバージョンを実行すると、私は別のGUIDを取得しますか?それは誰も助けることができるdatetime要素と関係があるように見えますか?
C#の拡張コード:
using system.data.linq;
...
...
public static class GuidExtensions
{
public static Guid ToNewModifiedGuid(this Guid guid)
{
var dateTime = new DateTime(2012,02,09,18,31,38);
var guidBinary = new Binary(guid.ToByteArray().Take(10).ToArray());
var dateBinary = new Binary(BitConverter.GetBytes(dateTime.ToBinary()).ToArray().Take(6).ToArray());
var bytes = new byte[guidBinary.Length + dateBinary.Length];
Buffer.BlockCopy(guidBinary.ToArray(), 0, bytes, 0, guidBinary.ToArray().Length);
Buffer.BlockCopy(dateBinary.ToArray(), 0, bytes, guidBinary.ToArray().Length, dateBinary.ToArray().Length);
return new Guid(bytes);
}
}
なぜ、別の値として返すのではなく、GUIDの一部にdatetimeを追加するのですか? – 48klocs
元のguidの最初の10バイトとdatetimeからの6バイトは、Guidの拡張として "modified guid"を作成するために使用されます... var modifiedGuid = Guid.NewGuid()。ToModifiedGuid() –
As Philipと私は)、これはかなり頭のよいコードのにおいです。 GUIDを切り詰めてdatetimeにタックを付けても、グローバルに一意のIDはより多く、まあまあではありません。 – 48klocs