有没有什么生成随机不重复的唯一 ID 且足够短的好办法?

2020-10-16 00:46:30 +08:00
 kaiki
B 站的 bv 号那种就感觉可以,但是太长,我想生成只有几位的数字+大小写字母组合的随机字符表作为 ID,但是怕万一随机出以前出过的 ID
9387 次点击
所在节点    问与答
67 条回复
lxk11153
2020-10-16 00:57:57 +08:00
搞一个 mysql 拿来自增 ID 不就好了
opengps
2020-10-16 01:08:15 +08:00
足够短跟容量是有直接制约的。首先得估算出最小的容量,然后研究下组成,然后计算出最小多长。

我当初设计过一款唯一访问 key,思路你参考下:
key 的参与构造字符,我用的是数字 10,大写字母 26,小写字母 26,虽然还可以用一部分单位符号但我没选,这样我的 key 只要 8 位字符就是 62 的 8 次方,就远远超过了 imei 的 15 纯数字位组合,而且还留下了巨大的空间,至于去重,我是每次随机生成完都检查一下是否已存在实现的,如果你对查重有性能要求的话需要重点改造下这个地方
lpts007
2020-10-16 01:19:51 +08:00
@opengps 62^8 < 10^15
ziseyinzi
2020-10-16 01:41:41 +08:00
kaiki
2020-10-16 01:57:45 +08:00
@lxk11153 主要是想无规律,不可逆,如果位数都能保持一致就最好了
meinjoy
2020-10-16 02:22:37 +08:00
我得方法是截取 uuid,随机一个起始位置比如 2,想要 5 位的 id,就 uuid.substring(2,7)就行了
kaiki
2020-10-16 02:26:10 +08:00
@meinjoy 和随机生成没什么区别,我打算随机生成几位数字大小写字母然后写入一个表中,绑定一个对应的数字 ID,查询的时候随机 ID 返回数字 ID,写入的时候查询随机 ID 是否存在,存在就重来一次生成过程。
这样随机的 ID 就和数字 ID 没有任何规律可循了。
594duck
2020-10-16 06:04:37 +08:00
数据足够多的时候又要来问怎么查得快
helloworld000
2020-10-16 06:42:44 +08:00
black11black
2020-10-16 06:50:53 +08:00
我倒是很好奇,用 hash 确实是保证基本不重复了,冲撞了的情况该怎么办呢?
Perry
2020-10-16 06:57:44 +08:00
@black11black 先了解冲撞的概率有多少再谈需要不需要考虑这种情况
lazydog
2020-10-16 07:02:34 +08:00
github 上应该一搜一大把吧,你可以搜搜看 unique id
black11black
2020-10-16 07:03:51 +08:00
@Perry 很有趣的回答,难道系统的设计者可以这么思考问题:因为冲撞是极小概率发生事件,所以不需要考虑?
Cooky
2020-10-16 07:09:52 +08:00
预先生成检测重复,用的时候再取
z7356995
2020-10-16 07:11:21 +08:00
数字 id 后端加密加盐一下,使用前再解密,应该比在表中查快一点
opengps
2020-10-16 07:17:35 +08:00
@lpts007 嗯,imei 用途中,有些位数不是数学里的所有数值都用的上,我是从实用角度足够用了,说的不严谨
avenger
2020-10-16 07:19:03 +08:00
Snowflake 了解一下
AndyAO
2020-10-16 07:19:53 +08:00
让我想起来了微软的全局标识符 GUID
iConnect
2020-10-16 07:28:03 +08:00
要短,要快,还要随机,满足三个条件,最简单就是随机预生成放号码池。
Perry
2020-10-16 07:56:52 +08:00
@black11black 这不是很正常的一个 tradeoff ? GUID 也有极小概率能被碰撞,依据你的逻辑一个普通应用还要去做好这样的碰撞情况?

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

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

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

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

© 2021 V2EX