0

私はおもちゃの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 = 1023222 - 1 = 41943030.type.id.idGUIDu32使用されるGUIDのタイプごとに1つあり(1023タイプはないと確信しています)、GUIDが必要になるたびに適切な数を増やすだけですが、特定の4194303GUIDを作成するとどうなりますかタイプ?

これは一意であることが保証されているため、ユーザーに実際のデータへのポインターを提供しtypedef void* GUID、APIユーザーにデータをいじりたくないことを知らせるために使用する方がよいでしょうか。または、GUIDが提供する抽象化が必要ですか?

1)これはGUID標準とはまったく関係ありません。私は独自にこの名前を思いついたのですが、実際にGUIDと呼ばれるものがあることに気付いたとき、新しい名前を思いついたのですが、まだ成功していません。

4

1 に答える 1

1

動的インデックス作成アルゴリズムは次のとおりです。

// variables
int instanceCount = 0;
int* recycler = malloc(sizeof *recycler);

// allocate index
int index = recycler[0];
if (!index) {
    index = (instanceCount+=1);
    recycler = realloc(recycler, (instanceCount+1) * sizeof *recycler);
    recycler[instanceCount] = 0;
} else {
    recycler[0] = recycler[index];
}

// deallocate index
recycler[index] = recycler[0];
recycler[0] = index;

// on initialization
recycler[0] = 0;

これがお役に立てば幸いです。私はかなり長い間同様のアルゴリズムを使用してきました。

それでも問題が解決しない場合は、時間を無駄にして申し訳ありません。

編集

明確にするために、私はC ++プログラマーなので、Cの世界に何が存在しないかを100%認識しているわけではないので、エラーが発生した場合は遠慮なく訂正してください。

編集

私はそれを徹底的にテストしました、そしてそれは完全に働きます。新しいIDが割り当てられる前に、すべてのギャップが埋められます。

于 2012-09-16T18:16:27.313 に答える