このサイトは小柳耕平が開発したソフトウェアで自動翻訳されています。正確な内容は元の 英語版 をご確認ください。

Splyncのデュアル識別子アプローチ: UUIDとオートインクリメント整数

Splyncが機密IDに二つの識別子を使用

Splyncのデータベースでは、すべてのユーザーとプロジェクトに二つの異なるIDが割り当てられています: UUIDとオートインクリメント整数です。 オートインクリメント整数は誰もが知っているカウンターのようなもので、1、2、3と連番で増えていきます。Splyncは、これらの整数をサーバーのデータベース内でほぼすべてのテーブルを整理するために使用しています。これはシンプルで速く、結合に効率的だからです。しかし、これら内部番号をアプリには表示しません。例えば、42番目に登録したユーザーの場合、データベース内の内部IDは42ですが、iOSアプリでは「42」とは表示されません。代わりにアプリはUUIDを使用します。同じアプローチをプロジェクトにも適用しています。データベース内のプロジェクトIDが「7」でも、アプリは常に長いUUIDで参照します。

UUIDとは何か

UUIDは、Universally Unique Identifier(ユニバーサリー・ユニーク・アイデンティファイヤー)の略です。SplyncはRFC 4122に準拠したバージョン4、バリアント1のUUIDを使用しています。これは最も広く採用されている標準の一つです。ランダムに生成される文字列で、949ca11c-a6ed-48a3-b40a-fa9727494917のように見えます。UUIDは通常、32の16進数文字をハイフンで区切った5つのセクションに分けて表記されます。これはグローバルにユニークで、異なるサーバーやデータベース間でも衝突しないよう設計されています。数学的には、約16^32 = 2^128通りの組み合わせがあります。しかし、バリアントとバージョンを示すために6ビットが予約されているため、バージョン4、バリアント1のUUIDの総数はおおよそ2^122、つまり約5.3×10^36通りです。これにより実用的な一意性が確保されています。

1/5,300,000,000,000,000,000,000,000,000,000,000,000の確率とは

UUIDv4のペアが一致する確率は約1/5.3×10^36です。その数値はあまりに小さくて想像を超えます。例えるなら、47個のサイコロを一度に振ってすべての目が「1」になる確率が1/6^47、つまり約1/3.7×10^36で、UUIDの衝突と同程度です。地球上の全員、約80億人が47個のサイコロを毎ミリ秒ごとに1兆年振り続けると仮定します。総試行回数は約2.5×10^32です。それでも同時に47個の「1」が出る確率は1万分の1でしかありません。これはUUIDv4が衝突する確率の低さを物語っています。「珍しい」どころではなく、宇宙的にあり得ない偶然です。数学者が驚いてコーヒーをこぼし、宇宙にバグがないか確認したくなるほどの出来事です。

UUIDを生成するのは簡単か

一見すると、UUIDの生成は簡単そうです。ランダムに見える英数字の文字列を作るだけですから。しかし、自分でペンと紙を使って一つ書いてみてください。36文字を書き留めることはできますが、何千回も同じことを繰り返すと、特定のパターンが現れます。例えば、特定の数字(3や8など)を好み、「x」のような文字は使わないかもしれません。コンピュータはこれらの偏りを瞬時に検出できます。悪意のあるハッカーがあなたの習慣を分析し、「ランダム」な秘密の文字列を1日で特定する可能性もあります。次に、コンピュータにrand()関数を使って各桁を生成させたらどうでしょう。これは改善されますが、それでも十分ではありません。多くの「ランダム」数生成器は擬似ランダムで、内部シード(通常はシステム時刻)を基にした予測可能な数学的シーケンスに従います。そのシードが発見または推測されると、生成したすべての値が再現可能になります。

UUIDはどれだけ完全にランダムか

完全なランダムは存在しません。完璧なサイコロや完全にランダムなサイコロの投げ方が存在しないのと同じです。すべての物理的またはデジタルなプロセスには、ある程度の法則があります。それでも、数学者やエンジニアは真のランダムに近づくアルゴリズムの設計に何十年も費やしています。Splyncが新しいバージョン4のUUIDを作成するときは、単に「ランダムに数字を選ぶ」わけではありません。オペレーティングシステムに微細な予測不可能性の痕跡を求めます。例えば、CPUがタスクを完了する正確な瞬間、ハードウェア内の微細な電気ノイズ、メモリのバックグラウンドタイミングの変動です。これらのエントロピーの断片が収集されて128ビットのデータに混ぜられます。結果は、アプリのユーザーや潜在的な悪意ある攻撃者に推測や再現がほぼ不可能なコードです。

Splyncのデュアル識別子アプローチ

Splyncは、ユーザーIDやプロジェクトIDといった機密識別子にUUIDを使用しています。これは非常にランダムで安全だからです。 一方で、サーバー内ではUUIDをオートインクリメント整数に変換し、大規模データセットでの検索や分析を高速化します。このデュアル識別子アプローチにより、安全性と利便性のバランスを保っています。外部のプライバシーと内部のパフォーマンスです。Splyncの目標は、ストレスフリーでシンプル、かつ安全な家計管理アプリであることです。目に見えるUIの背後で、私たちはアーキテクチャを洗練し続け、スムーズで安全、かつ賢く運用しています。