我正在写一个玩具操作系统,我需要一种方法来创建一个唯一的标识符(如Windows'HANDLE
除外)。这需要是纯粹的C/ASM数学;如果可能的话,我不想依赖任何东西,甚至不需要C标准库。我现在有一个存储的32位GUID 如下的数据结构:创建一个唯一的标识符 - 纯C
//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
字段的非法值。我的问题是,我不知道如何开发一个算法,它将唯一地填充内核创建的每个GUID
的字段.id
。我能想到的唯一算法是随机选择一个id,然后查看该id是否用于我想要创建的特定类GUID。但是,接下来我必须对所有创建的特定类型的GUID进行排序,看看它是否被采用,如果是,则重新做一遍。我也想过有一个u32
的数组,其中每个使用的GUID类型都有一个(我相信我不会有1023个类型),并且每次我想要一个GUID时都会增加适当的数字,但是当发生什么情况时会发生什么我已经创建了4194303个特定类型的GUID?
给用户一个指向实际数据的指针会更好吗?因为这肯定是唯一的,并且使用typedef void* GUID
让API用户知道我不希望他们搞乱我的数据?还是我需要GUID提供的抽象?
1)这与GUID standard没有任何关系。我独立地提出了这个名字,当我发现实际上有一种叫做GUID的东西时,我尝试提出一个新名字,但还没有取得任何成功。
看起来像C给我。我会尝试一下。谢谢 – nuju
不要假设'malloc'和朋友的数据类型的大小。这样的代码必然会在下一次崩溃。而且,代码中没有任何强制转换是必要的或者甚至是有用的。 –
谢谢Jens。 –