不通过数据库自增,如何生成一个用户ID?

qq_24623729 2019-12-06 09:21:20
接触到一个练手需求,打开注册页面的时候直接显示生成的用户ID,然后用这个用户ID去做注册操作并当主键保存到MYSQL中,随机的话如果数据过多,会有重复,虽然可以再次随机直到不重复但是感觉不是最优解,先插入一条空数据到数据库中会浪费内存,而且用户也不一定啥时候注册结束。。有没有好办法分享下啊···求指教
...全文
733 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
加油馒头 2020-01-02
  • 打赏
  • 举报
回复
类型+年月日时分+随机数 重复概率低
weixin_46063668 2019-12-23
  • 打赏
  • 举报
回复
是你的错误提示你了解我可以给你发
情谊梦幻 2019-12-17
  • 打赏
  • 举报
回复
UUID()
医手 2019-12-17
  • 打赏
  • 举报
回复
引用 12 楼 树成 的回复:
可以使用UUID作为主键,不过UUID有诸多缺陷: 1、UUID是无意义的,无序的,它本身只能做key,其它都干不了。 2、UUID需要统一分发,不然容易出现碰撞,既是一台物理机器分发UUID,如果多台机器分发UUID容易造成相同ID的出现,如果要避免这种情况,不同UUID分发机要添加对应的标识。 3、UUID比较长,会占用较多存储控件。 可以用统一自增长ID策略,这也有诸多缺陷: 1、需要存储生成ID的最大值。 2、需要解决并发问题。 3、不适合全局性的ID分发。 使用第三方ID算法,例如雪花算法: 一般这类算法会比较好用,但是缺陷是如何集成的问题,以及需要学习与理解算法的本质。 例如雪花算法解决了之上的各种问题,不过也带来新的问题,既是集成与配置的问题,使用较为麻烦。
你可能对UUID有什么误解哈。每一个字母代表的单词合起来的意思大致就是全球唯一标识符的意思。就是无论全球有多少台计算机,无论一秒内产生多少个标识符(在目前计算计运算能力下)都不会重复。 用自增整型ID还有一个问题就是,你总共有多少个用户,多少篇文章,多少个订单。别人一目了然,而这些通常是经营者的商业机密。
odMiracle 2019-12-17
  • 打赏
  • 举报
回复
可以给表添加一个 插入前的触发器
小小寅 2019-12-17
  • 打赏
  • 举报
回复
用临时表试试
我惠依旧 2019-12-16
  • 打赏
  • 举报
回复
投票UUID
java-小学生 2019-12-16
  • 打赏
  • 举报
回复
随机数加当前时间戳
树成 2019-12-16
  • 打赏
  • 举报
回复
可以使用UUID作为主键,不过UUID有诸多缺陷: 1、UUID是无意义的,无序的,它本身只能做key,其它都干不了。 2、UUID需要统一分发,不然容易出现碰撞,既是一台物理机器分发UUID,如果多台机器分发UUID容易造成相同ID的出现,如果要避免这种情况,不同UUID分发机要添加对应的标识。 3、UUID比较长,会占用较多存储控件。 可以用统一自增长ID策略,这也有诸多缺陷: 1、需要存储生成ID的最大值。 2、需要解决并发问题。 3、不适合全局性的ID分发。 使用第三方ID算法,例如雪花算法: 一般这类算法会比较好用,但是缺陷是如何集成的问题,以及需要学习与理解算法的本质。 例如雪花算法解决了之上的各种问题,不过也带来新的问题,既是集成与配置的问题,使用较为麻烦。
Gemini_Kanon 2019-12-16
  • 打赏
  • 举报
回复
用UUID吧
javabro 2019-12-11
  • 打赏
  • 举报
回复

import java.util.UUID;

public class UUIDUtils {

    public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z" };


    public static String generateShortUuid() {
        StringBuffer shortBuffer = new StringBuffer();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        for (int i = 0; i < 8; i++) {
            String str = uuid.substring(i * 4, i * 4 + 4);
            int x = Integer.parseInt(str, 16);
            shortBuffer.append(chars[x % 0x3E]);
        }
        return shortBuffer.toString();

    }
}
sun0322 2019-12-11
  • 打赏
  • 举报
回复
个人认为随机方案最好,前提条件时,
用户ID不作为主键,
举个类子,随机生成下面的字符串作为用户ID
1E08A1
六位,每一位是一个十六进制数字。
我认为这个数字已经很大了,重复的概率很小。
或者你从六位升级为8位,重复的概率就更小了。
licip 2019-12-11
  • 打赏
  • 举报
回复
像你这种情况,用UUID是比较合适的,主键只是一个标识,你不用管它长还是短。没有关系的。
dkwuxiang 2019-12-10
  • 打赏
  • 举报
回复
36位UUID出现重复的概率还是很小的; 也可以通过缓存(比如redis)存储一个数值(服务器启动的时候存储该表的id最大值),每次通过访问缓存自增,控制住并发
jiawenhe123 2019-12-10
  • 打赏
  • 举报
回复
单机下,可以使用一个AtomicInteger来生成,每次启动应用就从库里拿出最大的值。 在集群环境下,需要使用分布式锁来实现。
  • 打赏
  • 举报
回复
可以新建一个表,用来存你的id规则和当前id是第几个,每次新增的时候先去查这个规则表,拿到个数,并个数加一,然后生成ID插入进去
qq_24623729 2019-12-07
  • 打赏
  • 举报
回复
引用 2 楼 贵阳老马马善福专业维修游泳池堵漏防水工程的回复:
使用guid作为id
那id会不会有点太长了?
qq_24623729 2019-12-07
  • 打赏
  • 举报
回复
如果同时多个用户注册呢?
threenewbee 2019-12-06
  • 打赏
  • 举报
回复
使用guid作为id
路人黑白 2019-12-06
  • 打赏
  • 举报
回复
可以先查询数据库最大id然后加1吗

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧