求唯一 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,而且能保证不发生碰撞
10382 次点击
所在节点    问与答
43 条回复
a591826944
2014-05-20 13:24:23 +08:00
保证不发生碰撞?。。。怎么可能
tabris17
2014-05-20 13:27:33 +08:00
@a591826944 我从小空间映射到大空间,不发生碰撞是可以的吧
loading
2014-05-20 13:28:10 +08:00
uuid
tabris17
2014-05-20 13:30:03 +08:00
uuid如果用数字表示实在是太长了
loading
2014-05-20 13:33:27 +08:00
你这个id会有几个程序生成?如果是可控的,前面加个前缀不就好了?
jybox
2014-05-20 13:36:54 +08:00
@tabris17 在数据库里 uuid 可以存成二进制类型,通常也是可索引可比较的
tabris17
2014-05-20 13:38:57 +08:00
@jybox 因为要作为URL的一部分,太长的话生成的二维码就比较“花”了
tabris17
2014-05-20 13:39:45 +08:00
@loading 加前缀不够“离散”哎,至少要看上去比较随机
tabris17
2014-05-20 13:40:50 +08:00
这么说吧,就是为了防止别人从ID来判断当前的最大记录,或者通过ID来枚举所有信息
xhacker
2014-05-20 13:42:04 +08:00
tabris17
2014-05-20 13:45:02 +08:00
@xhacker 这个是用随机数生成的,会碰撞的吧
wdd2007
2014-05-20 13:49:33 +08:00
md5
kamal
2014-05-20 13:50:12 +08:00
关注一下,同样有这个需求
tabris17
2014-05-20 13:50:26 +08:00
@wdd2007 MD5没法保证不碰撞哪
akira
2014-05-20 13:55:25 +08:00
自增id后面加个随机数
tabris17
2014-05-20 13:56:06 +08:00
@akira 这个很容易就被发现规律了吧
wdd2007
2014-05-20 13:56:14 +08:00
@tabris17 你可以测试下,测试100亿内的,不会有碰撞的。
tabris17
2014-05-20 13:57:05 +08:00
或者把自增ID的每位数字打散后插入随机数字符串里?
tabris17
2014-05-20 13:57:56 +08:00
@wdd2007 主要是MD5还是有点太长了
crab
2014-05-20 13:58:45 +08:00
当ID超过5位数呢?

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

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

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

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

© 2021 V2EX