求唯一 ID 的生成算法

2014-05-20 13:17:06 +08:00
 tabris17
已知一个数据库自增长的INT字段是唯一的,要把这个ID用散列算法映射到一个更大的空间里(比如6位数字),而且对于连续的INT,散列生成的结果离散性要好,比如1=》721370;2=》894357;3=》198222,而不是1=》100000;2=》200000,3=》300000,而且能保证不发生碰撞
10290 次点击
所在节点    问与答
43 条回复
loading
2014-05-20 13:59:14 +08:00
#矫情
tabris17
2014-05-20 14:01:56 +08:00
@crab 超过5位数,可以映射到10位数的空间里,投射到的空间大小没限制,但是也别太大了,MD5摘要128位,用数字表示要几十位了
jakwings
2014-05-20 14:03:17 +08:00
@tabris17 那就尽量找 ACID 支持比较完美的数据库软件,同时适量地进行人工分散。完美主义害人不浅,现在客服都没用了么……
tabris17
2014-05-20 14:05:29 +08:00
最后决定随机数+碰撞处理,就这样吧
feikeq
2014-05-20 14:08:45 +08:00
你可以试试用时间戳....
tabris17
2014-05-20 14:10:17 +08:00
@feikeq 时间戳精确到秒,还是会碰撞
tabris17
2014-05-20 14:11:44 +08:00
@feikeq 时间戳+自增ID的个位数,应该不会碰撞了吧,除非一秒内插入10条以上的记录
guoruei
2014-05-20 14:14:50 +08:00
时间戳+自定义ID,再来个按队列处理,妥妥的。
ganxiyun
2014-05-20 14:16:10 +08:00
RC2 64bits输出
tabris17
2014-05-20 14:16:27 +08:00
@guoruei 这……还是处理碰撞的成本低一点
ritksm
2014-05-20 14:16:52 +08:00
feikeq
2014-05-20 14:17:01 +08:00
@tabris17 你可以再加个毫秒,我就是这样做的。
tabris17
2014-05-20 14:19:44 +08:00
@feikeq 也对,如果只要求10年内不发生碰撞,还可以把时间戳前面最高几位去掉,还能再短点
aisk
2014-05-20 15:43:27 +08:00
skip32
lu18887
2014-05-20 16:02:51 +08:00
只有时间是唯一的!过了这一刻就不会再来了!所以,好好利用时间来避开碰撞。另外,随机的度不控制好就容易出现碰撞!每一个时间都是平行时空!
lu18887
2014-05-20 16:06:13 +08:00
时间+自增ID+不可逆算法
tabris17
2014-05-20 16:11:52 +08:00
@aisk 这个貌似好用,谢谢
clippit
2014-05-20 17:27:51 +08:00
数字长一点没关系,加到 URL 里可以把它转换成36进制(a-z0-9)甚至62进制(A-Za-z0-9),这样就短了
aisk
2014-05-20 17:49:56 +08:00
@tabris17 http://meizhi.im/ 现在数据库还是存的自增,显示出来的是skip32+base36,应该和你的需求一致
banxi1988
2014-05-21 09:34:46 +08:00
找一个在第一象限单调递增的函数。把现在人id看成X
Y=func(x),这样的Y就是你要的新的id.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX