我正在编写一个玩具操作系统,我需要一种方法来创建一个唯一的标识符(如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的东西时,我试着想出一个新名字,但还没有取得任何成功。
答案 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之前,将填补所有空白。