私はおもちゃのOSを書いていますが、一意の識別子を作成する方法が必要です(WindowsのようにHANDLE
)。これは純粋なC/ASM数学である必要があります。可能であれば、C標準ライブラリでさえも、何にも依存したくありません。現在、次のように32ビットGUID1を格納するデータ構造があります。
//u32 = unsigned 32-bit integer, and so on
typedef union
{
struct { u32 type : 10; u32 id : 22; }; //Okay in C99 with gcc -fms-extensions
u32 guid;
} GUID;
GUIDを実際のデータに関連付ける別の構造がありますが、この投稿の目的では、それほど重要ではありません。
typedef struct
{
GUID guid;
void *data;
} GUIDTblEntry;
私のカーネルは、GUIDのタイプをサポートし、各タイプのGUIDの一意のインスタンスを最大でサポートすることを願っています(これで十分ですよね?)。フィールドとフィールドの不正な値になりたいので、1を引きます。私の問題は、カーネルが作成する各フィールドに一意に入力するアルゴリズムを開発する方法がわからないことです。私が考えることができる唯一のアルゴリズムは、ランダムにIDを選択し、そのIDが作成したい特定のクラスのGUIDに使用されるかどうかを確認することです。ただし、その特定のタイプで作成されたすべてのGUIDを並べ替えて、使用されているかどうかを確認し、使用されている場合は、すべてをやり直す必要があります。私はまた、210 - 1 = 1023
222 - 1 = 4194303
0
.type
.id
.id
GUID
u32
使用されるGUIDのタイプごとに1つあり(1023タイプはないと確信しています)、GUIDが必要になるたびに適切な数を増やすだけですが、特定の4194303GUIDを作成するとどうなりますかタイプ?
これは一意であることが保証されているため、ユーザーに実際のデータへのポインターを提供しtypedef void* GUID
、APIユーザーにデータをいじりたくないことを知らせるために使用する方がよいでしょうか。または、GUIDが提供する抽象化が必要ですか?
1)これはGUID標準とはまったく関係ありません。私は独自にこの名前を思いついたのですが、実際にGUIDと呼ばれるものがあることに気付いたとき、新しい名前を思いついたのですが、まだ成功していません。