我正在编写一个玩具操作系统,我需要一种创建唯一标识符的方法(如 WindowsHANDLE
除外)。这需要是纯 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;
我的内核有望支持各种类型的 GUID,每种类型的 GUID 最多具有唯一实例(这已经足够了,对吗?)。我减去一个是因为我想成为字段和字段的非法值。我的问题是我不知道如何开发一种算法来唯一地填充内核创建的每个字段。我能想到的唯一算法是随机选择一个 id,然后查看该 id 是否用于我要创建的特定 GUID 类。但是,我必须对所有为该特定类型创建的 GUID 进行排序,以查看它是否被占用,如果是,则重新执行整个操作。我也想过有一个数组210 - 1 = 1023
222 - 1 = 4194303
0
.type
.id
.id
GUID
u32
每种使用的 GUID 类型都有一个(我确定我不会有 1023 种类型),并且每次我想要一个 GUID 时只增加适当的数字,但是当我创建 4194303 个特定的 GUID 时会发生什么类型?
只给用户一个指向实际数据的指针会更好吗,因为这保证是唯一的,并typedef void* GUID
用来让 API 用户知道我不希望他们弄乱我的数据?还是我需要 GUID 提供的抽象?
1)这与GUID 标准无关。我独立想出了这个名字,当我发现实际上有一个叫做 GUID 的东西时,我试着想出一个新名字,但还没有成功。