.NET9から新しくBCLに追加されたGuid.CreateVersion7()を試していきます。
実行環境
- .NET Fiddle
- .NET9 RC2
Version7?
Guid.CreateVersion7()はUUID Version 7を実装したGuidです。従来のGuid.NewGuid()ではUUID Version 4のUUIDが作られます。UUID Version 4はソートが出来ない問題がありましたが、UUID Version 7はタイムスタンプを持つためソートができるようになっています。
実際に生成してみる
手元に.NET9を試せる環境が無かったので.NET Fiddle(C#のPlayground)を使って試しました。
var v7Items = Enumerable.Range(0, 10) .Select(_ => (date: DateTime.Now, guid: Guid.CreateVersion7())) .OrderBy(item => item.guid); foreach (var item in v7Items) { Console.WriteLine($"{item.date:hh:mm:ss.fffff}: {item.guid}"); }
実行結果
02:51:39.61090: 0192e30f-8ada-7036-8a0f-7c4c7c3f9ca0 02:51:39.61091: 0192e30f-8ada-7200-8f8d-ef563b185b4e 02:51:39.61090: 0192e30f-8ada-72e5-a7aa-22171a533bac 02:51:39.61090: 0192e30f-8ada-7426-b8f5-ba79934d9d6c 02:51:39.61090: 0192e30f-8ada-742b-b59c-e986a79b129d 02:51:39.61078: 0192e30f-8ada-77d1-a612-1b95d0e98a38 02:51:39.61091: 0192e30f-8ada-7924-b113-9a474a3afcd7 02:51:39.61091: 0192e30f-8ada-7950-a83c-c1fac1d9db2d 02:51:39.61091: 0192e30f-8ada-7c1b-b78c-3e8fdf5daaf0 02:51:39.61090: 0192e30f-8ada-7f0e-b6ff-de91dd23cc60
生成した日付順にソートされるかと思ったのですが、Guid.CreateVersion7()を呼び出す間隔が速すぎて、1ms未満の時間差はGUIDに反映されないみたいです。 少し生成する間隔をあけてみます。
var v7Items = Enumerable.Range(0, 10) .Select(_ => { Thread.Sleep(100); return (date: DateTime.Now, guid: Guid.CreateVersion7()); }) .OrderBy(item => item.guid); foreach (var item in v7Items) { Console.WriteLine($"{item.date:hh:mm:ss.fffff}: {item.guid}"); }
実行結果
03:02:36.65755: 0192e319-9171-7e31-86a3-7fe0bce31081 03:02:36.75795: 0192e319-91d5-767b-a8c4-682eef1ca94c 03:02:36.85812: 0192e319-923a-75d6-bff8-57119007e5fe 03:02:36.95834: 0192e319-929e-7abd-ae4e-a7da107ec49c 03:02:37.05854: 0192e319-9302-7191-a403-0be73870d209 03:02:37.15879: 0192e319-9366-7733-8e20-582a76f5f4a8 03:02:37.25891: 0192e319-93ca-7f71-a76c-a1917b142cec 03:02:37.35920: 0192e319-942f-75fc-8ad4-7dfcca13a7e3 03:02:37.45934: 0192e319-9493-7da8-8b1e-f64d90f61e15 03:02:37.55945: 0192e319-94f7-7890-9dd2-9334958734fc
Guidでソートした結果、ちゃんと生成時間順にソートされていることがわかりました。