如何生成固定长度唯一随机字符串?

2018-01-15 17:41:45 +08:00
 xfund4
1. 字符串长度固定在 8 位[a-zA-Z0-9],仅要求千万数据量下保证唯一
2. 不需要根据随机串解码出原值。
3. 随机串不能被猜测出。
4. 有自增 ID 可以使用,但是随机串不能有规律。
13905 次点击
所在节点    PHP
57 条回复
maemual
2018-01-15 17:43:08 +08:00
自增 ID 改成随机自增 x
Sypher
2018-01-15 18:00:56 +08:00
丢 list 里啊,生成的时候检查下 list.contains(newStr)。
Keyes
2018-01-15 18:01:36 +08:00
生成订单号吗?参考京东做法,订单号有一个用户 id 作为 parent,随便猜,没有用,而且订单号可以做很短,客服和客户可以很容易识别
bearice
2018-01-15 18:03:37 +08:00
XTEA 加密
xfund4
2018-01-15 18:05:38 +08:00
@Keyes 类似于 生成邀请码,兑换码。
porrat
2018-01-15 18:07:12 +08:00
sha1(random_chars)
scriptB0y
2018-01-15 18:07:20 +08:00
uuid.uuid4()
porrat
2018-01-15 18:07:57 +08:00
看错了,以为是 40 位,可以再编码一次
xfund4
2018-01-15 18:08:27 +08:00
@Sypher 类似兑换码的业务,数据库压力很低, 不想借助 redis 之类的服务。

另外,生成的随机串要求上面给错了。 是 [A-Z1-9]
chinvo
2018-01-15 18:09:10 +08:00
ksuid K-Sortable Globally Unique IDs 长度太长不符合楼主要求

shortid 7-14 位,位数不固定

hashids 同位数不固定(非传统意义 ID,而是将数字 ID 加密,可逆算法
lululau
2018-01-15 18:10:51 +08:00
邀请码兑换码肯定要存库的,这个直接随机就好了吧,随机完了查下库里是不是有这个数了,有的话就重新随机一个,一个 alphanum 字符可以编码 5 位,就按 4 位算,8 个字符可以编码 4 个字节了,4 个字节怎么还不够千万;还是说不知道怎么把一个整数转换成 alphanum 字符串?
xfund4
2018-01-15 18:11:27 +08:00
@chinvo 由于数据量是可控的, 所以额外要求了生成的串 必须是 8 位 [A-Z1-9]
honeycomb
2018-01-15 18:13:43 +08:00
最笨的一个办法是用 csprng 导出二进制数,再转换成楼主需要的 36 进制
tabris17
2018-01-15 18:14:24 +08:00
根据自增 ID,用 skip32 加密,然后 base62 编码
moult
2018-01-15 18:14:28 +08:00
自增 ID 从 10 进制转到 62 进制。然后再追加随机字符串补全 8 位。这样可以不用去数据库校验是否重复,虽然前面几位有规律,但是后面是随机的,也能做到猜不出。
http://php.net/manual/en/function.random-bytes.php
chinvo
2018-01-15 18:14:41 +08:00
@xfund4 hashids 可以控制最短位数,如果你的数据(数值型 id )没有超过一定限制,那么你固定最短 8 位就可以保证输出的字符串时 8 位的。另外 hashids 字符串范围可控,在初始化的时候传入一个 string 就好。

我也没有其他更好的方案了,你可以先试一下这个。
xfund4
2018-01-15 18:16:53 +08:00
@moult 是的,我不希望再查一次数据库防碰撞。62 进制补足 8 位 这个随机补位有可能会造成重复啊。
lululau
2018-01-15 18:19:11 +08:00
要随机就免不了碰撞,要不想检查碰撞就不可能随机。。。
Magnus1k
2018-01-15 18:24:23 +08:00
不想碰撞就把所有符合的字符串全部生成了,然后随机挑一点出来用。
daodao
2018-01-15 18:26:16 +08:00
hash

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

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

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

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

© 2021 V2EX