生成唯一字母 ID 求解
有一个需求是不用数字作为用户 ID,要用英文字母
我现在有三种解决方案
第一种:用户注册时候,生成一个随机英文字符串,去查用户表,如果重复再重新生成,直到唯一。
第二种:先生成一张字母 ID 表,每次用户从里面取,取了就标记为已用。
第三种:用函数把用户数字 ID 转为字母 ID,但是转出来的 ID,两个相近的用户,字母 ID 太相似了。
有什么更好的解决方案吗?
有一个需求是不用数字作为用户 ID,要用英文字母
我现在有三种解决方案
第一种:用户注册时候,生成一个随机英文字符串,去查用户表,如果重复再重新生成,直到唯一。
第二种:先生成一张字母 ID 表,每次用户从里面取,取了就标记为已用。
第三种:用函数把用户数字 ID 转为字母 ID,但是转出来的 ID,两个相近的用户,字母 ID 太相似了。
有什么更好的解决方案吗?
然后转换成 base53 字符串(仅包含字母和下划线)
配置密钥,真实
一个简单的实现是, 当前时间(unixtime, 秒和毫秒都可以) + 机器码(比如集群是 100 个机器, 那就号码就是 00 – 99) + 三位轮询的数(每个机器启动时候就拿到一个打乱的大小是 1000 的数组, 里面的数是 000 – 999, 生成的时候从里面取数然后移除, 空了再生成一次)
这么干冲突的概率相当小(几乎不会有)
github.com 上搜一下,不同语言都有实现,一定程度上满足需求吧
有可读性要求的话, 准备字典, 然后随机生成两到组拼起来, 预先生成也行; 生成后查重复也行; 直接按顺序映射也可以, 生成的结果大概类似 docker 的默认名字, 比如 adoring_lovelace 之类的
我们的生产环境上,id 是有个预资源池,初始可能是 n 位,随用随取。如果用完了,就 stop the world 并再生成一个位数为 n+1 的 id 新池子。
这个思路的来源是编译器中内存分配以及垃圾回收的几个简单算法。
gem ‘friendly_id’