社区
数据结构与算法
帖子详情
求一个ID分配算法
Matzzh
2008-03-31 11:28:28
现在我想得到一个整数ID,这个ID值是在一个范围内(1~256)。当然这时可能有好几个线程不同模块都需要获取一个ID,也就是说,每个模块分得的ID是不同的。但当这个模块结束时,会释放掉这个ID,同时这个ID是可以再次被分配的。现在不考虑用数组、链表(一个使用ID链表,一个空闲ID链表)等方式,因为可能存在的ID范围可能会变大(1~2^32) 这时就可能不太现实了。希望能用一个比较奇淫的方式,时间、空间代价都比较小的算法。
...全文
305
5
打赏
收藏
求一个ID分配算法
现在我想得到一个整数ID,这个ID值是在一个范围内(1~256)。当然这时可能有好几个线程不同模块都需要获取一个ID,也就是说,每个模块分得的ID是不同的。但当这个模块结束时,会释放掉这个ID,同时这个ID是可以再次被分配的。现在不考虑用数组、链表(一个使用ID链表,一个空闲ID链表)等方式,因为可能存在的ID范围可能会变大(1~2^32) 这时就可能不太现实了。希望能用一个比较奇淫的方式,时间、空间代价都比较小的算法。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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时尽量取用零散的。
不知道是否有标准的方法,不过我觉得优化的话还是跟你的程序有很大的关系。
有问题请指正,互相学习
分布式
ID
之雪花
算法
Seata基于改良版雪花
算法
的分布式UU
ID
生成器分析:时间戳和节点
ID
位置进行了调换。Seata内置分布式
ID
的代码位置:io.seata.common.util.
Id
Worker,可以直接使用;com.baom
id
ou.mybatisplus.core.toolkit.
Id
Worker也有
ID
生成器。
如何生成分布式雪花
算法
ID
Snowflake,中文称为雪花
算法
,是Twitter开源的一种分布式
ID
生成
算法
。通过该
算法
生成的
ID
为64位的长整型数值,其结构中引入了时间戳,从而基本实现了自增。如果能保证标识位不重复,则生成的雪花
ID
也不会重复。通过前面的案例可以看出,
ID
重复的必要条件。如果要避免服务内产生重复的
ID
,需要从标识位上进行调整。我们来看一下开源框架中如何使用雪花
算法
定义标识位。Mybatis-Plus v3.4.2:其雪花
算法
实现类Sequence提供了两种构造方法:无参构造方法会自动生成和。
Linux/Unix
分配
进程
ID
的方法以及源码实现
在Linux/Unix系统中,每个进程都有
一个
非负整型表示的唯一进程
ID
。虽然是唯一的,但是进程的
ID
可以重用。当
一个
进程终止后,其进程
ID
就可以再次使用了。大多数Linux/Unix系统采用延迟重用的
算法
,使得赋予新建进程
ID
不同于最近终止进程所使用的
ID
,这主要是为了防止将新进程误认为是使用同一
ID
的某个已终止的先前进程。本文讨论了Linux/Unix
分配
进程
ID
的方法以及源码实现。
【题解】
ID
分配
题目描述 您正在处理要为每个客户端
分配
唯一
ID
的特定系统的后端。但是,系统是分布式的,并且有许多组件,每个组件都必须能够为客户端
分配
ID
。换句话说,您希望每个组件都使用尽可能少的组件之间的通信来
分配
ID
。您已经确定保持系统分布比确保所有客户端都具有唯一
ID
更重要。因此,您正在考虑让每个组件从大量可能的
ID
中随机
分配
ID
,并在每天结束时同步
分配
的
ID
。换句话说,每个组件将根据所有组件
分配
的
ID
...
Linux C
ID
分配
参考文章Linux进程P
ID
分配
策略 P
ID
位图
算法
作者详细分析了P
ID
位图
算法
,请先阅读原文。 本文修正了两处BUG并进行了功能扩展。 BUGS 1.耗尽P
ID
-> 释放P
ID
X(例如X = 15) -> 申请P
ID
(申请到X) -> 释放P
ID
Y(例如Y = 10) -> 申请P
ID
(申请不到Y) 2.unsigned long *p = ((unsigned l
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章