4D 20 R10 から、UUID はシステム関数に依存するのではなく、内部アルゴリズムを使って直接生成されるようになりました。これにより、フォーマットや動作をより細かく制御できます。また、今回のアップデートでは、時系列ソートをサポートするバージョン 7 UUID の選択が可能になりました。アプリケーションへの影響について詳しく見ていきましょう。
UUIDバージョンを理解する
すべての UUID は同じフォーマットを共有しています: 32個の 16進数文字 (0-9 + A-F) で表される 128ビットです。しかし、それらは異なるタイプの情報をエンコードすることができます。RFC 9562 は現在 8つの UUIDバージョンを定義しています。内部的には UUID は 2つの 64ビット整数で格納され、64ビットCPU上で比較・クエリ・ソートを非常に効率的におこなうことができます。16進数文字は単なる表示形式であり、内部的には使用されません。
これまで 4D は、UUID の生成をシステム関数に頼っていました。これらの関数は、どのバージョンが使われているかを選択したり、確認することさえできませんでした。実際には、これらの関数は通常、バージョン4 の UUIDを生成し、完全にランダムでした。
RFC の最近の進化で、バージョン7 が導入されました。これはタイムスタンプを埋め込み、UUID を作成時間でソートできるようにしたものです。4Dフィーチャーリクエストフォーラムでは、多くの方からご要望いただいておりましたが、4D 20 R10 で実装いたしました!
デフォルトはバージョン4
一貫性と互換性を確保するために、4D はデフォルトでバージョン4 の UUID を使い続けます。しかし、4D はもはやUUID を生成するためにシステム関数に頼らず、内部で計算するようになりました。これにより、将来のシステムアップデートによる予期せぬ変更を防ぐことができます。
また、バージョン7 の時系列ソートを利用したい場合は、設定またはコードによって有効にすることができます。
バージョン7 の特徴
バージョン7 の UUID は Unix Epoch タイムスタンプで始まり、時系列にソートすることができます。これは開発やデバッグにおいて、新しく作成されたレコードをリストボックスの一番上 (または一番下) に表示させたい場合に特に便利です。
バージョン7 ではマイクロ秒の精度を使用しているため、ミリ秒単位に制限されている従来の Timestampコマンドよりも細かい粒度を提供します。
注記: 同じマイクロ秒内に複数のレコードが作成された場合、それらのレコードは同じタイムスタンプ部分を共有します。しかし、追加のランダムバイトのおかげで、それらの UUID は一意になります。これらの同じタイムスタンプを持つレコード間で時系列ソートすることは意味がないかもしれませんが、他のレコードと一緒にソートすることは依然として有用です。実際には、レコードの作成には通常 1マイクロ秒以上かかるため、このような特殊ケースはまれでしょう。
バージョン7 の自動UUID の新しい設定
自動UUID のバージョン7 の有効化は簡単です。ストラクチャー設定ダイアログを開き、データベース > データストレージページに進み、希望の UUIDバージョンを選択するだけです。

いったんバージョン7 に設定すると、主キーに使用されるような自動生成UUID はすべて、新しいフォーマットに従うようになります。
一貫性を保つため、データベース内の既存の UUID は変更されません。また、バージョン4 とバージョン7 の違いは内部的なもの (ストラクチャーで定義されるものではありません) なので、どちらのフォーマットも問題なく共存できます。
バージョン7 の UUID をコードで生成する
UUID 生成の Generate UUIDコマンドもバージョン7 をサポートするように更新されました。パラメーターとしてバージョンを指定するだけです! とても簡単でしょう?
パラメーターがない場合、コードの一貫性を保つため、デフォルトで使用されるバージョンは 4 のままです。
var $uuid : Text
$uuid:=Generate UUID // v4: 578BFEC987BD4C11AE8AB9CD3DC12DD0
$uuid:=Generate UUID(4) // v4: C2BE4B6723634DBE9F4387B1226A4B4F
$uuid:=Generate UUID(7) // v7: 0198C7A4E41A7B6CB39F460873165D30
$uuid:=Generate UUID(7) // v7: 0198C7A543557F89AA7D83563AB5C97E
上記の結果を簡単に比較してみましょう:
- バージョン4 の UUID は完全にランダムです。
- バージョン7 の UUID は共通の接頭辞 (タイムスタンプ) を持ち、最後にランダム性があります。
私たちは、この新機能が開発により多くの柔軟性とコントロールを与えることを願っています。いつものように、私たちはあなたのフィードバックに耳を傾け、あなたのニーズを満たすために 4D を進化させていきます。
それでは、よいコーディングを!
