一意の識別子

ソースは
Wikipedia
ChatGPT
Google
DeepL

①カウンター

一意な識別子を生成する方法のひとつは、新しい識別子が必要となるたびにカウンターをインクリメントする方法である。この方法は、カウンターをリセットしたりロールバックしたりしない限り、各識別子が一意であることを保証する。

②UUID

UUID(Universally unique identifier)は、標準化された形式に従って生成された128ビットの値である。UUIDは、UUID生成アルゴリズムを実装したソフトウェアライブラリやツールを使って生成することができる。UUIDはグローバルに一意であるように設計されており、2つのUUIDが同じである確率は極めて低くなっている。

pythonの場合

import uuid
# Generate a random UUID
random_uuid = uuid.uuid4()
# Print the UUID
print(random_uuid)

規格

wikipediaより

Network Computing Systemで導入され、
それをDistributed Computing Environment(DCE)の一部として
Open Software Foundation(OSF)が標準化し、
「ISO/IEC 11578:1996 "Information technology -- Open Systems Interconnection -- Remote Procedure Call (RPC)"」の一部として文書化されている。またIETFはUUIDに関してRFC 4122 を公開している。

RFC4122

4.2.1. Basic Algorithm

The following algorithm is simple, correct, and inefficient:
o Obtain a system-wide global lock
o From a system-wide shared stable store (e.g., a file), read the
UUID generator state: the values of the timestamp, clock sequence,
and node ID used to generate the last UUID.
o Get the current time as a 60-bit count of 100-nanosecond intervals
since 00:00:00.00, 15 October 1582.
o Get the current node ID.
o If the state was unavailable (e.g., non-existent or corrupted), or
the saved node ID is different than the current node ID, generate
a random clock sequence value.
o If the state was available, but the saved timestamp is later than
the current timestamp, increment the clock sequence value.
o Save the state (current timestamp, clock sequence, and node ID)
back to the stable store.
o Release the global lock.
o Format a UUID from the current timestamp, clock sequence, and node
ID values according to the steps in Section 4.2.2.
If UUIDs do not need to be frequently generated, the above algorithm
may be perfectly adequate. For higher performance requirements,
however, issues with the basic algorithm include:
o Reading the state from stable storage each time is inefficient.
o The resolution of the system clock may not be 100-nanoseconds.
o Writing the state to stable storage each time is inefficient.
o Sharing the state across process boundaries may be inefficient.

Each of these issues can be addressed in a modular fashion by local
improvements in the functions that read and write the state and read
the clock. We address each of them in turn in the following
sections.

o システム全体のグローバルロックを取得する
o システム全体の共有安定ストア(ファイルなど)から、UUID生成器状態(最後のUUIDを生成するために使用したタイムスタンプ、クロックシーケンス、およびノードIDの値)を読み取る
o 1582年10月15日00時00分00秒からの100ナノ秒間隔の60ビットカウントとして現在時間を取得
o 現在のノードIDを取得
o 状態が使用できない場合(例えば、存在しないか破損している場合など。状態が利用可能であったが、保存されたタイムスタンプが現在のタイムスタンプよりも遅い場合、クロックシーケンス値をインクリメントする。
o 状態(現在のタイムスタンプ、クロックシーケンス、ノードID)を安定保存に戻す。 UUIDを頻繁に生成する必要がない場合、上記のアルゴリズムは完全に適切である かもしれない。
o システムクロックの分解能は100ナノ秒ではないかもしれない。

これらの問題は、状態の読み書きとクロックの読み込みを行う関数を局所的に改良することで、モジュール方式で対処することができる。 以下の節で、それぞれを順番に取り上げます。
Translated with DeepL

GUID

wikipediaより

GUID (英: Globally Unique Identifier) またはグローバル一意識別子(ぐろーばるいちいしきべつし)は、UUIDの実装のひとつ、あるいは(事実上)UUIDの別名である。
UUIDのマイクロソフトによる実装を指すと解されることもあるが、オラクルのデータベースやNetIQのeDirectory(ディレクトリ・サービス)、GUIDパーティションテーブルなど、ほぼUUIDを指して、GUIDの語が使われることもある。

WinAPIの場合

CoCreateGuid

#include <objbase.h>

GUID guid;
HRESULT hr = CoCreateGuid(&guid);
if (SUCCEEDED(hr))
{
    // Use the guid variable
}

MSDNより

CoCreateGuid 関数は、グローバルに一意の 128 ビット整数である GUID を作成する RPC 関数 UuidCreate を呼び出します。 分散環境で永続的な識別子として使用する絶対に一意の番号が必要な場合は、 CoCreateGuid を使用します。 非常に高い確実性を得るために、この関数は一意の値を返します。同じシステムまたは他のシステム上の他の呼び出し (ネットワーク化されているかどうか) は、同じ値を返す必要はありません。

UuidCreate

#include <rpcdce.h>

UUID uuid;
RPC_STATUS status = UuidCreate(&uuid);
if (status == RPC_S_OK)
{
    // Use the uuid variable
}

UuidFromString

#include <rpcdce.h>

// Convert a string to a GUID
RPC_STATUS status;
UUID uuid;
status = UuidFromString((RPC_WSTR)L"{550e8400-e29b-41d4-a716-446655440000}", &uuid);

// Convert a GUID to a string
RPC_WSTR str;
status = UuidToString(&uuid, &str);

③ハッシュ関数

一意な識別子を生成するもう一つの方法は、あるデータから一意な値を計算するためにハッシュ関数を使うことである。たとえば、ハッシュ関数を使って、タイムスタンプ、乱数、その他アプリケーションに固有のデータの組み合わせから、一意な識別子を計算することができる。


④データベースの自動インクリメント

情報を格納するためにデータベースを使用している場合は、データベースの自動インクリメント機能を使用することができます。それは自動的にテーブルに挿入された各新しい行に一意の値を生成します。

⑤上記の方法の組み合わせ

時には、複数の方法を組み合わせて一意な識別子を作成するのが良いアイデアです。例えば、タイムスタンプと乱数をハッシュ関数の入力として使用し、一意の識別子を生成することができます。
一意な識別子を生成するために選択する方法は、アプリケーションの特定の要件と制約に依存することに注意することが重要です。

分散システム

NCS

The Network Computing System (NCS) was an implementation of the Network Computing Architecture (NCA). It was created at Apollo Computer in the 1980s. It comprised a set of tools for implementing distributed software applications, or distributed computing.
The design and implementation of DCE/RPC, the remote procedure call mechanism in the Distributed Computing Environment, is based on NCA/NCS. It also was the first implementation of Universally unique identifiers.

Network Computing System (NCS) は、Network Computing Architecture (NCA) の実装である。1980年代にApollo Computer社で作成された。分散ソフトウェアアプリケーション、すなわち分散コンピューティングを実装するためのツール群から構成されていた。
分散コンピューティング環境におけるリモートプロシージャコール機構であるDCE/RPCの設計と実装は、NCA/NCSをベースにしている。また、Universally unique identifiersを最初に実装したのもNCA/NCSである。
Translated with DeepL


DCE

Distributed Computing Environment(DCE)は、1990年代初期にアポロコンピュータ(現在のヒューレット・パッカードの一部)、IBM、DECなどが結成したコンソーシアムが開発したソフトウェアシステムである。DCE はクライアントサーバモデルのアプリケーション開発のためのフレームワークとツールキットを提供する。フレームワークには、遠隔手続き呼出し (RPC) 機構 DCE/RPC、ネーミング(ディレクトリ)サービス、タイムサービス、認証サービス、認可サービス、分散ファイルシステム DCE/DFS が含まれる。

RPC

Remote Procedure Call(リモートプロシージャコール)

あるコンピューターで動作しているプログラムが、別のコンピューターで動作している関数やプロシージャを呼び出すことができる技術。関数呼び出しは、呼び出し側のプログラムからは透過的で、ローカル関数を呼び出しているように見える。しかし、その裏側では、関数呼び出しがネットワークを介してリモートコンピューターに送られ、そこで実行され、呼び出し元のプログラムに結果が返される。

RPC関数は、システムの異なるコンポーネントが異なるコンピュータ上で実行され、互いに通信する必要がある分散システムでよく使用される。RPCメカニズムにより、これらのコンポーネントは、異なるマシン上で動作しているにもかかわらず、あたかも同じコンピュータ上で動作しているかのように相互作用することができる。

Windows APIは、RPCアプリケーションを作成・管理するための一連の関数を提供する。これらの関数は Rpcdce.dll ライブラリに含まれている。このライブラリで提供される関数の例としては、以下のようなものがある。

RpcServerUseProtseq:この関数は、サーバーが着信した RPC コールをリッスンするためにどのプロトコルシーケンス(例:TCP または名前付きパイプ)を使用するかを指定するために使用されます。
RpcServerRegisterIf: この関数は、RPCランタイムにインターフェースを登録し、クライアントがインターフェースによって公開された関数を呼び出せるようにするために使用されます。
RpcServerListen: この関数は、指定されたプロトコルシーケンスで着信したRPCコールのリスニングを開始するために使用されます。
RpcServerUnregisterIf: この関数は、RPCランタイムからインターフェースの登録を解除するために使用する。
RpcBindingFromStringBinding: この関数は、バインディングハンドルの文字列表現をバイナリバインディングハンドルに変換するために使用されます。
RpcStringBindingCompose:この関数は、プロトコルシーケンス、ネットワークアドレス、およびエンドポイントから文字列バインディングハンドルを構成するために使用されます。
リモートプロシージャコールには、gRPCのような他の選択肢もあることは注目に値します。gRPCは、リモートプロシージャコール(RPC)APIを構築するための高性能なオープンソースフレームワークです。

透過性

wikipediaより

ヒューマンマシンインターフェースにおいてユーザーが技術的詳細に悩まずに済む使い易さの側面であり、例えば、プログラムがディスプレイの解像度を自動認識する方がユーザーにいちいち質問するものよりも「透過的」であると言える。

ネットワークにおいては、同一のユーザーインターフェイスやアプリケーションインターフェイスで異なる論理動作をサポートするソフトウェアは「透過的」であると言える。例えば、Network File System は遠隔地にあるファイルをあたかもローカルな記憶装置に置かれているかのようにアクセスできるようにしている。

DCE/RPC

wikipediaより

DCE/RPC(Distributed Computing Environment / Remote Procedure Calls)は、複数のコンピュータ上のソフトウェアをあたかも1つのコンピュータ上で動作しているかのように動作させる遠隔手続き呼出し (RPC) システムの一種である。これにより、分散処理ソフトウェアをネットワーク関連をどう実装するかを気にせずに構築できる。

DCE/RPC は DCE そのものとは異なる。DCE/RPC は DCE の一部であり、他にも CDS や DFS が DCE に含まれる。

CDS (Cell Directory Service)
DFS (Distributed File System)

SOAP

通信プロトコル。
XML-RPCから発展。

そういう意味でRPCの実装と言える(wikipediaより)

ChatGPTより
SOAP (Simple Object Access Protocol) は、Web上でのリモートプロシージャコールを可能にするためによく使われるという意味で、RPC (Remote Procedure Call) の実装と考えることができる。
SOAPは、リモートプロシージャコールで送信される情報を構造化するためのメッセージフォーマットとルールセットを提供します。メッセージ形式としてXMLを使用し、認証や暗号化などの追加情報を含めるために使用できる、エンベロープ、ヘッダー、ボディなどの要素を含んでいます。
SOAPメッセージがHTTPなどのトランスポートプロトコルで送信されると、リモートシステムはSOAPメッセージの情報を使って適切な関数やプロシージャを呼び出すことができる。この意味で、SOAPはWeb上でのRPCスタイルの通信のためのメッセージ形式としてよく利用されます。
SOAPはRPCに限らず、ドキュメントスタイルのメッセージングなど、他のタイプのメッセージングにも使用できることは注目に値します。メッセージは自己完結しており、サーバー上で実行される特定の手順を必要としません。また、SOAPはHTTP上に限らず、SMTPやTCPなど他のトランスポートプロトコル上でも使用することができる。

REST

REST(Representational State Transfer)は、Webサービスを構築するためのアーキテクチャスタイルの1つで、HTTPプロトコルの原則に基づいている。RESTful Web サービスは、RPC (Remote Procedure Call) 実装の一種と考えることができ、RPC 呼び出しがリモート関数またはプロシージャを呼び出すのと同様に、クライアントがサーバー上のリソースにアクセスしてそのリソースに対して操作を実行できるようにするものです。
RESTful Web サービスでは、HTTP メソッド(GET、POST、PUT、DELETE など)を使用してサーバー上のリソースと対話し、リソースは URI(Uniform Resource Identifiers)によって識別されます。標準的なメソッドは、リソースの取得、作成、更新、削除に使用されます。
RESTful Web サービスは、RPC 呼び出しがリモート関数またはプロシージャを呼び出すのと同様に、クライアントがサーバー上のリソースにリモートでアクセスして操作できるため、RPC の一形態と見なすことができます。ただし、RESTful Web サービスは、従来の RPC 実装よりも軽量かつシンプルであると一般に考えられており、特定のメッセージ形式やプロトコルを使用する必要はありません。RESTful Web サービスでは標準の HTTP メソッドを使用し、JSON や XML などの任意のメッセージ形式を使用することができるためです。
RESTful Web サービスは、従来の RPC ではなく REST の原則に基づいているため、SOAP のような特定のメッセージ形式や TCP のような特定のプロトコルを必要としないことは、注目に値します。RESTful Web サービスはリソースの原則に基づいており、HTTP メソッドはこれらのリソースに対して操作を実行するために使用されます。

この記事が気に入ったらサポートをしてみませんか?