创建唯一标识符 - 纯C

时间:2012-09-16 17:58:53

标签: c uniqueidentifier id-generation

我正在编写一个玩具操作系统,我需要一种方法来创建一个唯一的标识符(如Windows HANDLE除外)。这需要纯粹的C / ASM数学;如果可能的话,我不想依赖任何东西,甚至不是C标准库。我目前有一个存储32位GUID 1 的数据结构,如下所示:

//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;

我的内核有望支持210 - 1 = 1023种类型的GUID,每种类型的GUID最多只有222 - 1 = 4194303个唯一实例(这已经足够了,对吧?)。我减去一个因为我希望0字段成为.type字段和.id字段的非法值。我的问题是我不知道如何开发一种算法,该算法将唯一地填充内核创建的每个.id的{​​{1}}字段。我能想到的唯一算法是随机选择一个id,然后看看是否为我想要创建的特定GUID类获取了该id。但是接下来我必须对所有特定类型的GUID进行排序以查看它是否已被采用,如果是,则重新执行整个操作。我还想过有一个GUID数组,其中每个使用的GUID类型都有一个(我确定我不会有1023种类型),每次我想要一个GUID时只增加相应的数字,但是那么当我创建了特定类型的4194303 GUID时会发生什么?

向用户提供指向实际数据的指针会更好吗,因为这保证是唯一的,并使用u32让API用户知道我不希望他们弄乱我的数据?或者我是否需要GUID提供的抽象?

1)这与GUID standard没有任何关系。我独立想出了这个名字,当我发现实际上有一个名为GUID的东西时,我试着想出一个新名字,但还没有取得任何成功。

1 个答案:

答案 0 :(得分: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 ++程序员,所以我不是100%意识到C世界中不存在的东西,所以如果出现任何错误,请随时纠正我。

修改

我刚刚对它进行了彻底的测试,它完美无缺。 在分配任何新ID之前,将填补所有空白。