生成唯一字母 ID 求解

2020-01-22 10:51:13 +08:00
 lg106

有一个需求是不用数字作为用户 ID,要用英文字母

我现在有三种解决方案

第一种:用户注册时候,生成一个随机英文字符串,去查用户表,如果重复再重新生成,直到唯一。

第二种:先生成一张字母 ID 表,每次用户从里面取,取了就标记为已用。

第三种:用函数把用户数字 ID 转为字母 ID,但是转出来的 ID,两个相近的用户,字母 ID 太相似了。

有什么更好的解决方案吗?

10526 次点击
所在节点    PHP
53 条回复
Varobjs
2020-01-22 10:57:12 +08:00
就是随机生成不唯一的用户名呗
lg106
2020-01-22 10:59:46 +08:00
@Varobjs 也可以这么说,用户 ID 要显示在外面,我们不想让别人看到我们的数字 ID,所以想用英文来代替,包括我们的文章 ID 也是要弄成英文 ID
imlinhanchao
2020-01-22 11:00:48 +08:00
@lg106 uuid 可否?
whypool
2020-01-22 11:01:07 +08:00
新增数据可以用 UUID,把横杠去掉就行,就是有点长
用户名+时间戳+MD5 也能生成唯一 ID
crypto 库也能生成唯一 ID
jfcherng
2020-01-22 11:01:56 +08:00
hashids
jinhan13789991
2020-01-22 11:03:25 +08:00
第一个人是 AAAAAAAA,第二个人是 AAAAAAAB,以此类推~ 变相的 26 进制自增
eojessie
2020-01-22 11:04:46 +08:00
@jinhan13789991 这个容易被枚举了。。。。
lg106
2020-01-22 11:05:35 +08:00
@imlinhanchao 可能太长了
otakustay
2020-01-22 11:05:55 +08:00
就用自增键然后 hash 一下呢
lg106
2020-01-22 11:06:25 +08:00
@jinhan13789991 我第三种就是这种,可以用函数转化,但容易被找规律
lg106
2020-01-22 11:06:45 +08:00
@whypool 我试试第三种,UUID 有点长
lg106
2020-01-22 11:06:58 +08:00
@jfcherng 我试试去
Varobjs
2020-01-22 11:08:21 +08:00
@lg106 那就数字 id md5 下就可以了,多方便
lg106
2020-01-22 11:10:25 +08:00
@Varobjs 我忘了说了,长度只能是 8 到 10 位,太长了不行,类似这种 rczlihkgyt
GM
2020-01-22 11:10:45 +08:00
HashID 了解一下,数据表可以继续用自增 id 字段,对外做个转换变成 HashID 就好了。
009694
2020-01-22 11:14:45 +08:00
前两种方案有什么缺点吗?
Marmot
2020-01-22 11:17:01 +08:00
hashids 靠谱
cgpiao
2020-01-22 11:17:40 +08:00
设备 id + 自定义格式时间 + 自增 转换为 36 进制
lg106
2020-01-22 11:22:37 +08:00
试了下 hashids,这个完美解决,感谢大佬们
eason1874
2020-01-22 11:25:52 +08:00
怕 ID 暴露可以用 36 进制,36 个字符打乱顺序就不好猜了,但如果获得连续 ID 还是可以破解出来。

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

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

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

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

© 2021 V2EX