![](/style/images/good.png)
![](/style/images/bad.png)
有什么基于短数字的唯一 id 生成器的实现?
source link: https://www.v2ex.com/t/788066
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
我目前看到的雪花算法生成的 id 基本都是长整型,有没有短数字唯一 id 生成,直接生成 int,比如 b 站 av 号之类的。既然是短数字的唯一 id 生成,那就不会应用到类似“订单 id 生成”等诸如 1 秒内生成几百几千个 id 的场景中,
希望能在服务端内部生成,不用必须依赖数据库来生成 id,能控制长度(比如长度固定,或者数字长度不低于几位不高于几位之类的)
有没有序无所谓,当然如果能选择无序模式或有序模式的话,那最好不过了。
那么有哪些实现的呢,或者哪些工具类有这些功能了
qwe520liao 23 小时 9 分钟前
说一下我们之前做过的一个 ID 生成服务:不同实体的 ID,都是一个隔离开的空间范围,这个递增的空间范围需要由一个独立的服务来进行维护和管理。传入实体类型,也就是一个 Key 绑定一个 ID 的当前值,并告诉这个服务我需要多大范围的 ID,可以设计一个接口:
(start, end) nextIdRange(key, size)
其中 key (实体标识)和 size (获取多少个)为参数,用于获取一段 ID 范围,返回值 start 为起始值,end 为结束值。
客户端获得以后就可以在这个范围内进行本地递增。需要注意的是,这个接口需要保证原子性,也就是并发的时候不会返回相同的数据,每一次调用都将会导致内部维护的当前 ID 值发生变化。
客户端如果生成 ID 频繁,可以考虑优化为当剩余的 ID 快要耗尽时,另外起一个线程去预取下一批次的 ID 段(假设是跨网络的服务调用,ID 生成服务为一个独立的进程),保证 ID 生成不会受到获取 ID 这个操作的延迟影响,设置为多少合适则取决于实际的情况。
oddcc 22 小时 52 分钟前
简单的设计可以考虑提前生成 id,放到库里
服务端用的时候一批一批的取,只要取出来就认为是用掉了
整体设计比较简单,好理解,也没有过多的依赖
macttt 19 小时 59 分钟前
libook 19 小时 19 分钟前
如果担心被遍历的话就用时间戳+随机数字再 HASH,只不过越短碰撞可能性越大。
当然也可以数据库自增再加随机量的增量,然后再做个风控监测,如果某客户端短时间内访问了大量的无效 ID 就封掉。
缩短 ID 的最重要的一步是做进制转换。
自增是十进制,HASH 是十六进制,如果你大小写不敏感就一律转换成 36 进制,即 0-9a-z,如果大小写敏感就用 62 进制,0-9a-zA-Z,这个如果用 JS 的话可以直接 toString(进制数)。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK