生成唯一字母 ID 求解

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

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

我现在有三种解决方案

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

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

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

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

10526 次点击
所在节点    PHP
53 条回复
lasuar
2020-01-22 20:18:44 +08:00
利用自增思想,A->B 等效于 1->2
fdingiit
2020-01-22 20:22:46 +08:00
有请求,再创建不是一个好的生产环境策略。

我们的生产环境上,id 是有个预资源池,初始可能是 n 位,随用随取。如果用完了,就 stop the world 并再生成一个位数为 n+1 的 id 新池子。

这个思路的来源是编译器中内存分配以及垃圾回收的几个简单算法。
gamexg
2020-01-22 21:02:00 +08:00
hashid 挺好,
我做过类似的另一个需求,
不过原始 id 是二进制数据,直接固定 iv 的 aes 流加密来做的。
rogwan
2020-01-22 21:07:26 +08:00
hashids + 盐。
LancerEvo
2020-01-22 21:28:07 +08:00
记得在某个公司的代码里见过一个微服务 用的第二种实现
zyqhi
2020-01-22 21:43:43 +08:00
26 进制
ech0x
2020-01-22 21:53:22 +08:00
生成一个 UUID 不就行了,UUID3 或者 UUID5
wd
2020-01-22 22:17:07 +08:00
我觉得第一种就挺好的 uuid 里面取几位用 不会那么大概率需要生成第二次
zpvip
2020-01-22 22:42:41 +08:00
我不知道为什么 Ruby on Rails 在国内这么不受待见。这个需求一行代码就搞定了

gem 'friendly_id'
lookas2001
2020-01-23 00:34:20 +08:00
8 位 id 取 5 次都有重复的可能性基本上就为 0 了
所以,第一种
dandandanerdan
2020-01-23 06:57:56 +08:00
uuid 是最安全的
polymerdg
2020-01-23 09:05:53 +08:00
我用的是 MD5(用戶名+時間戳+隨機 6 位)
huzb
2020-01-24 22:45:24 +08:00
用函数把用户 ID 转成字母 ID 是最好的,可以确保唯一且在前端就完成校验。相近 ID 这个可以用混淆和扩散的方式把变化打乱。我有总结过一篇文章:huzb.me/2018/03/23/简单的密码学生成唯一邀请码 /

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

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

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

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

© 2021 V2EX