我是想自动生成一个唯一的二级域名名称,目前是: site-时间戳-用户 ID.domain.com
老板看到后说太长了,要控制在 3 位数,各位大神们有什么好的解决办法?
1
RihcardLu 2018-06-07 16:06:05 +08:00
26 个英文字母+10 个数字,36^3=46656
4w 多个,每次生成逐一检索的查询量也很小了,关键是够用吗? |
2
ss098 2018-06-07 16:08:03 +08:00
生成 3 位字母 / 数字的所有排列组合(由于 3 位的排列组合有限,不会占用很大内存,这是可以接受的),从中去除已经使用的组合,得到未使用的组合。
从这个组合中随机抽取一个使用。 |
3
nine99 2018-06-07 16:08:51 +08:00
1 楼说的对
|
4
ifishman 2018-06-07 16:09:52 +08:00 via Android
首先考虑是否够用,然后就随便了
|
5
noe132 2018-06-07 16:54:33 +08:00 via Android
生成所有组合然后乱序。需要时直接取一个出来就可以了
|
6
viator42 2018-06-07 17:05:19 +08:00
每一位都从 26 个字母和数字中随机一个字符,有几位数循环几次.生成之后查询数据库判断是否重复
|
7
laoyur 2018-06-07 17:30:48 +08:00 2
你:报告老板,三位数只能 4w 个用户,咱们就这格局?
老板:你个瓜娃子,三位数用完不会上四位数啊! |
8
glacer 2018-06-07 17:44:02 +08:00
就算一位数是一个字节,也能表示 256 种 ASCII 码,三位随机数的空间已经达到 2^24 了。
|
9
zhujinliang 2018-06-07 17:56:12 +08:00 via iPhone 1
www 那位会是谁呢
|
11
victor 2018-06-07 18:04:00 +08:00
@glacer RFC3986 文档规定,URL 中只允许包含英文字母( a-zA-Z )、数字( 0-9 )、-_.~ 4 个特殊字符以及所有保留字符。
|
12
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,有对应用户占用的就不会继续被分配,后续扩展的时候继续生成新的段就好 预先生成一整个段还有一个好处是可以允许用户“选号” |
15
scnace 2018-06-07 19:30:20 +08:00 via Android 1
1Il 0oO 记得去掉
|
16
CFO 2018-06-07 20:00:10 +08:00 via Android
符号再来一波 期待+1s
|
17
loading 2018-06-07 20:04:47 +08:00 via iPhone
先全部生成出来,打乱放入数据库,然后按顺序分配就行。
|
18
loserwn 2018-06-07 20:13:41 +08:00
[a-z][0-9] 3 位,相当于 36 进制随机数。
|
19
kethylar 2018-06-07 20:17:00 +08:00
pwgen 3 -1 -n 1000000|awk '!a[$0]++'
|
20
yiplee 2018-06-07 21:26:40 +08:00 via iPhone
数字 id 递增,然后 base62 一下,保证不会重复
|
21
oIMOo 2018-06-07 22:56:41 +08:00
@chinvo
最近用到的一个,但是不确定不同值是否会产生相同 hash. # Doc: http://www.drdobbs.com/database/hashing-rehashed/184409859 # code: https://sourceforge.net/p/cuckoo2mist/code/HEAD/tree/trunk/class_mist.py def ELFHash(key): hash = 0 x = 0 for i in range(len(key)): hash = (hash << 4) + ord(key[i]) x = hash & 0xF0000000 if x != 0: hash ^= (x >> 24) hash &= ~x return hash def int2hex(n, len): assert n is not None assert len is not None try: hexval = ('0' * len) + "%x" % int(n) except ValueError: hexval = ('0' * len) + "%x" % int(n, 16) return hexval[len * -1:] def hashPJW(text): number = ELFHash(text) res = int2hex(number, 8) return res |
22
silencefent 2018-06-07 22:59:12 +08:00
递归存数据库里,用一个删一个
|
23
feverzsj 2018-06-07 23:30:01 +08:00
62 个可选字符的话,对应所有三位 base62 的十进制数范围是[3844, 238327],随机选择一个转成 base62,因为只有 234484 种可能,所以还要查重。
|
24
jingrui 2018-06-08 09:19:38 +08:00 via iPhone
1 楼对,生成前查下
|
25
s609926202 OP @jingrui 这样的话就得把每次生成的都存进数据库里了、存表里好呢还是存字段值好?
|