生成唯一字母 ID 求解

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

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

我现在有三种解决方案

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

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

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

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

10526 次点击
所在节点    PHP
53 条回复
vanishcode
2020-01-22 11:33:42 +08:00
https://github.com/souyunku/SnowFlake
不知道是不是楼主想要的。。
xaplux
2020-01-22 11:37:31 +08:00
@vanishcode 很明显不是,楼主想要的是全字母的,17 楼说的 hashids 靠谱
tabris17
2020-01-22 11:50:06 +08:00
snowflake 算法生成 64 位整数

然后转换成 base53 字符串(仅包含字母和下划线)
hubqin
2020-01-22 11:52:24 +08:00
取巧,JavaScript:Math.random().toString(36).slice(2)
wengcd
2020-01-22 11:55:45 +08:00
https://hashids.org

配置密钥,真实🆔根据密钥生成 hash 值;有密钥可反推出真实🆔,没有则无法反推
alaikis
2020-01-22 11:58:50 +08:00
数字 36 进制
MrYELiex
2020-01-22 13:00:43 +08:00
snowflake
Raymon111111
2020-01-22 13:10:39 +08:00
snowflake 这种方案然后把 0 到 9 映射到 a - j 上就行了.

一个简单的实现是, 当前时间(unixtime, 秒和毫秒都可以) + 机器码(比如集群是 100 个机器, 那就号码就是 00 - 99) + 三位轮询的数(每个机器启动时候就拿到一个打乱的大小是 1000 的数组, 里面的数是 000 - 999, 生成的时候从里面取数然后移除, 空了再生成一次)

这么干冲突的概率相当小(几乎不会有)
ZSeptember
2020-01-22 14:37:27 +08:00
uuid->hash->baese64 取前 10 位
sleepm
2020-01-22 14:43:25 +08:00
有个自增主键 id,然后,先插入新纪录,然后获取 id,再根据 id 生成全字母的 ID
luopengfei14
2020-01-22 14:44:56 +08:00
36、62 进制都可以
fx
2020-01-22 15:33:21 +08:00
hashids
jeremaihloo
2020-01-22 16:14:54 +08:00
nanoid

github.com 上搜一下,不同语言都有实现,一定程度上满足需求吧
qsbaq
2020-01-22 16:29:22 +08:00
把 ID 弄个 md5 肯定唯一了
songco
2020-01-22 16:44:02 +08:00
没有可读性要求可以直接 id 映射一下就行, 比如数字转换成 16 进制; 比如 0-9 映射成 10 个字幕

有可读性要求的话, 准备字典, 然后随机生成两到组拼起来, 预先生成也行; 生成后查重复也行; 直接按顺序映射也可以, 生成的结果大概类似 docker 的默认名字, 比如 adoring_lovelace 之类的
Liang
2020-01-22 16:45:08 +08:00
@qsbaq md5 在一定概率下会重复的
wzwwzw
2020-01-22 18:50:25 +08:00
uuid 去掉 - 呗。
kkkkkrua
2020-01-22 19:18:38 +08:00
将数字转成 58 进制
hauzi
2020-01-22 20:11:54 +08:00
第一种
fireapp
2020-01-22 20:13:47 +08:00
mongo object id 还不错可以试试

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

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

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

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

© 2021 V2EX