2012-09-16 34 views
0

我正在写一个玩具操作系统,我需要一种方法来创建一个唯一的标识符(如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的东西时,我尝试提出一个新名字,但还没有取得任何成功。

回答

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之前将填充所有空白。

+0

看起来像C给我。我会尝试一下。谢谢 – nuju

+2

不要假设'malloc'和朋友的数据类型的大小。这样的代码必然会在下一次崩溃。而且,代码中没有任何强制转换是必要的或者甚至是有用的。 –

+0

谢谢Jens。 –