• 全部
  • 问答

求一个ID分配算法

Matzzh 2008-03-31 11:28:28
现在我想得到一个整数ID,这个ID值是在一个范围内(1~256)。当然这时可能有好几个线程不同模块都需要获取一个ID,也就是说,每个模块分得的ID是不同的。但当这个模块结束时,会释放掉这个ID,同时这个ID是可以再次被分配的。现在不考虑用数组、链表(一个使用ID链表,一个空闲ID链表)等方式,因为可能存在的ID范围可能会变大(1~2^32) 这时就可能不太现实了。希望能用一个比较奇淫的方式,时间、空间代价都比较小的算法。
...全文
175 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lori_c 2008-04-02
每个算法都会有最优和最差情况,只能尽量求平均下的最优吧
如果ID使用率高,那就保存未使用的ID,如果使用率低,则保存已用的
把连续的ID组成1块来保存
这是空间上的
用Hash的方法,是缩短时间消耗的
看实际情况再修改吧
回复
Matzzh 2008-03-31
To : guoruixing

同样存一个问题ID范围过大,你查看ID是否在线总得要保存ID的状态,这都是空间上的问题。其实我最想是能够通过当前已分配ID数,一个进似于数学上的算法解出一个合法的ID。比如一个HASH,并可以回收ID,或者一个空间坐标的映射关系。。。。
回复
Matzzh 2008-03-31
考虑一个极端的情况,只分配一个ID,和所有ID都被分配。

上面已经说明了,一个线程中存在多个模块,也就是说可能一个线程中模块需要多个ID,我想过用HASH的方式来完成,最主要是如何将使用完成的ID回收回来,并且要考虑大范围ID,比如1~65536,做一个链表最少要 3 * 2(Byte) * 65536 = 393,216 = 393KB,这在嵌入式中已经是使用了很大的空间了。

“保存一个现在使用的最大的ID数,这之后的ID都是可用的”,假设现在有ID范围(1~256), 16个线程每个线程一共分配16个ID,256个ID都分配完了,这时10号线程第16号模块(ID:160)使用完了资源,释放掉这个ID。。。。。
回复
guoruixing 2008-03-31
歪法:
如果线程不是很多,例如1000以内(^_^)
那就用在线法,
线程得到ID,然后看这个ID是否在线,如果在线(即被别的线程用了,就重新获取)

例如:QQ,MSN,网络游戏,论坛,等等,用户何止成千上万,但是如果该用户已经登录,则会有相应的提示出现。
回复
lori_c 2008-03-31
我觉得LZ提供的信息不够,比如说ID的使用率大概是多少?
如果使用率比较高,我有下面几个想法:
1、让线程ID和获得的ID挂上钩,也就是用散列的思想
2、保存一个现在使用的最大的ID数,这之后的ID都是可用的,之前的可用ID则都储存起来,并把相邻的可用ID整合成一块,取用ID时尽量取用零散的。

不知道是否有标准的方法,不过我觉得优化的话还是跟你的程序有很大的关系。
有问题请指正,互相学习
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-31 11:28
社区公告
暂无公告