ひでぼ~blog

C#ときどきゲーム

Guid.CreateVersion7()を試す

.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でソートした結果、ちゃんと生成時間順にソートされていることがわかりました。

参考

qiita.com

kakakakakku.hatenablog.com