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

2020-10-16 00:46:30 +08:00
 kaiki
B 站的 bv 号那种就感觉可以,但是太长,我想生成只有几位的数字+大小写字母组合的随机字符表作为 ID,但是怕万一随机出以前出过的 ID
9471 次点击
所在节点    问与答
67 条回复
a570295535
2020-10-16 13:44:12 +08:00
就用楼上那些方式,
1 、用代码生成 100 万个 id 或更多
2 、去重复并放进数据库
3 、用户来一个取一个
完成!
随取随用,只有一开始你自己麻烦一次,这样不仅短还不会重复!
unixeno
2020-10-16 13:53:21 +08:00
@black11black md5 这种已经能有快速碰撞算法的 hash 讨论这个就没意义了,你要用 sha256 还能撞吗?你要是现在能找到碰撞的 sha256,第一件事儿应该是去发个论文
单论生日攻击,sha256 你要达到 10^-15 的碰撞概率需要 1.5*10^31 个数据,这个概率啥概念?大概是下一秒小行星撞地球然后人类灭绝的概率
至于 10^31 啥概念?现在人类所有数码化保存的信息总量也才不到 10^22
与其担心极小概率的碰撞,你不如先担心一下高能粒子打到你 CPU 上造成 bit 反转让你 hash 算错了
kaiki
2020-10-16 13:57:55 +08:00
重复问题上,再次随机就行了,大家没必要那么严肃。
那么是实时查写号码池,还是提前准备号码池呢?
imn1
2020-10-16 14:01:23 +08:00
如果你所说的场景,不必随机,只要时间序列做一个最小转换就行了,只要外部不知道转换算法,看上去就是随机的
网站或者业务的一些 id,往往还包含了轻量的分类信息,这个就不是单纯随机就能完成的需求了
popoer
2020-10-16 14:08:54 +08:00
snowflake 不香吗
wyz123723
2020-10-16 14:33:42 +08:00
@black11black 你这问题就和有人真破解了 sha256 了怎么办
wyz123723
2020-10-16 14:36:25 +08:00
hash 碰撞的概率比一坨量子突然汇聚成一个特别喜欢你的美女的概率还要小
jaylee4869
2020-10-16 15:25:02 +08:00
redis increment
xuewuchen
2020-10-16 15:50:30 +08:00
GUID 吧。。
killergun
2020-10-16 15:54:37 +08:00
感觉你这个需求不就是短地址生成
imhui
2020-10-16 16:00:42 +08:00
如果是单机服务,线型同余 或许可以试一下
azoon
2020-10-16 16:02:10 +08:00
楼主要求不高,这么随便的话。就每次生成随机字符串时判断数据库是否存,存在就再次生成,就好了吧。
我之前给别人做了个拍照预约系统的订单号就这么搞。
xuanbg
2020-10-16 16:12:04 +08:00
@imdong 我搞了个编码生成器,就是顺序生成,但是通过查表变换,可以得到看似随机的结果,但和原值一一对应,不重复。

代码很简单:
for(int i = len - 1; isEncrypt && i > 0; code = garble(code)) {
--i;
}
private static String garble(String str) {
int len = str.length();
String first = len > 2 ? str.substring(0, 1) : "";
String high = len > 3 ? str.substring(1, len - 2) : "";
String low = String.valueOf(set.get(str.substring(len - 2, len)));
return high + low + first;
}
Jooooooooo
2020-10-16 16:19:02 +08:00
了解一下鸽笼原理
tamer
2020-10-16 16:20:52 +08:00
@wyz123723 那么请问有没有办法能加快这样的汇聚呢,很急,在线等
xuanbg
2020-10-16 16:21:10 +08:00
@xuanbg set 就是 00-99 的密码表,通过查表可以得到一个对应的预生成的随机值。加密后的数字理论上必需得到密码本、交换方法和交换次数才能还原加密前的数字,三者缺一不可。
tabris17
2020-10-16 16:21:50 +08:00
hashids
iyangyuan
2020-10-16 16:37:45 +08:00
预生成,最简单最可靠。
假设长度 6 位,每一位可选[a-z][0-9],那么就是 20 亿的容量(不够用增加长度即可)。
每次预生成,不能太多,也不能太少,那么我们可以控制前 2 位递增(00,01...zy,zz),每次生成固定前 2 位,后 4 位全量,这样就是百万级别的容量,应该够用一段时间,快消耗完时依此类推。
这样就能满足生成快、读取快,不重复,足够短。
TomVista
2020-10-16 16:56:34 +08:00
36 进制 id,每次随机一个数字进行随机递增,产生随机 id.
TomVista
2020-10-16 17:16:09 +08:00
@TomVista 带大小写的话,就是 62 进制,8 位就是 2 百万亿,够用到天荒地老了,随机范围 1000 的话,还在 2 千亿级别.

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

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

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

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

© 2021 V2EX