バージョン7 における UUID の改善とソート機能

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 を進化させていきます。
それでは、よいコーディングを!

Avatar
- プロダクトオーナー - Damien Fuzeauは、2019年2月に4D Productチームに参加しました。プロダクトオーナーとして、ユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換することを担当しています。また、実装された機能が顧客のニーズを満たしているかどうかを確認することも彼の役割です。ナント大学のソフトウェア工学科を卒業。前職の会社では最初は開発者として(1997年に4Dを発見)、後にエンジニアリングマネージャーとソフトウェアアーキテクトとして、23年以上勤務しました。この会社は、4DのOEMパートナーであり、現在は数千のユーザーと数百のサーバーに向けて4Dベースのビジネスソフトを展開しています。ですから、Damienは、多言語環境での4D開発・導入に慣れています。