老板说:生成三位数的随机数,不能重复。这道题怎么破?

2018-06-07 16:02:49 +08:00
 s609926202

我是想自动生成一个唯一的二级域名名称,目前是: site-时间戳-用户 ID.domain.com

老板看到后说太长了,要控制在 3 位数,各位大神们有什么好的解决办法?

4715 次点击
所在节点    问与答
25 条回复
RihcardLu
2018-06-07 16:06:05 +08:00
26 个英文字母+10 个数字,36^3=46656
4w 多个,每次生成逐一检索的查询量也很小了,关键是够用吗?
ss098
2018-06-07 16:08:03 +08:00
生成 3 位字母 / 数字的所有排列组合(由于 3 位的排列组合有限,不会占用很大内存,这是可以接受的),从中去除已经使用的组合,得到未使用的组合。

从这个组合中随机抽取一个使用。
nine99
2018-06-07 16:08:51 +08:00
1 楼说的对
ifishman
2018-06-07 16:09:52 +08:00
首先考虑是否够用,然后就随便了
noe132
2018-06-07 16:54:33 +08:00
生成所有组合然后乱序。需要时直接取一个出来就可以了
viator42
2018-06-07 17:05:19 +08:00
每一位都从 26 个字母和数字中随机一个字符,有几位数循环几次.生成之后查询数据库判断是否重复
laoyur
2018-06-07 17:30:48 +08:00
你:报告老板,三位数只能 4w 个用户,咱们就这格局?
老板:你个瓜娃子,三位数用完不会上四位数啊!
glacer
2018-06-07 17:44:02 +08:00
就算一位数是一个字节,也能表示 256 种 ASCII 码,三位随机数的空间已经达到 2^24 了。
zhujinliang
2018-06-07 17:56:12 +08:00
www 那位会是谁呢
MiffyLiye
2018-06-07 18:00:03 +08:00
@glacer 但并不是随便什么字符都能往域名里放
victor
2018-06-07 18:04:00 +08:00
@glacer RFC3986 文档规定,URL 中只允许包含英文字母( a-zA-Z )、数字( 0-9 )、-_.~ 4 个特殊字符以及所有保留字符。
chinvo
2018-06-07 18:07:08 +08:00
@glacer #8 特殊字符是不能放进去的,还要考虑人可读性

HashIDs 可以把 userid 加密为 url 友好的字符串,但是长度不可控

如果自己实现算法, [a-z0-9-_] ^3 有 54872 种可能,数量确实不是太多

不过如果长度是可以扩展的,填满三位之后从 a 开始填,甚至还可以把三位码保留作 VIP

可以预先生成 [a-z0-9-_] ^3,有对应用户占用的就不会继续被分配,后续扩展的时候继续生成新的段就好

预先生成一整个段还有一个好处是可以允许用户“选号”
jimages
2018-06-07 18:25:22 +08:00
@RihcardLu 你忘了区分大小写
ob
2018-06-07 18:31:48 +08:00
@jimages 域名不区分大小写
scnace
2018-06-07 19:30:20 +08:00
1Il 0oO 记得去掉
CFO
2018-06-07 20:00:10 +08:00
符号再来一波 期待+1s
loading
2018-06-07 20:04:47 +08:00
先全部生成出来,打乱放入数据库,然后按顺序分配就行。
loserwn
2018-06-07 20:13:41 +08:00
[a-z][0-9] 3 位,相当于 36 进制随机数。
kethylar
2018-06-07 20:17:00 +08:00
pwgen 3 -1 -n 1000000|awk '!a[$0]++'
yiplee
2018-06-07 21:26:40 +08:00
数字 id 递增,然后 base62 一下,保证不会重复

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

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

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

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

© 2021 V2EX