本文章仅仅针对MySQL数据库进行演示

一、使用int类型的主键自增

这种方法很简单,也是很多人都喜欢的方式。但是缺点也很明显:

  1. 以博客系统为例,查看一个文章的地址是这样: www.xxxx.com/read-article?id=1 ,那么有经验的人一看就知道这个id就是文章的id,那么就有人可能会直接在浏览器上把1换成2、3…如果不是一个博客系统,而是一些电商、金融等设计的数据比较敏感的,那么就会出大问题了。
  2. 如果不适用ORM框架(比如MyBatis),由于这个ID是数据库自增的,所以业务层不知道这个id的值,需要重新查询,这个步骤无疑是多余的。但是如果使用一些数据库的框架,比如MyBatis就可以在sql映射文件中查询标签设置将自增的主键返回。

二、使用MySQL的函数生成UUID

SELECT UUID();

有两个问题

  1. ID过长,占用空间较大
  2. 新增操作时,业务层不知道ID,非要重新查一遍数据库才知道。 所以这种方法比较少见。

三、使用Java生成的UUID

String uuid = UUID.randomUUID().toString();
//可以把生成的uuid里面的-去掉
uuid = uuid.replaceAll("-","");
//之后就可以进行赋值存库的操作了

这种方法,虽然解决了上面的业务层不清楚ID的情况,但是生成的UUID还是过长,占用空间的问题还是没有解决。

四、自己设计算法,生成短的UUID

为了获得短的UUID,有的小伙伴可能会对UUID直接进行截取,但这样做无疑会大大增大UUID的重复率,这样做是绝不推荐的。 正确的做法是下面这样。

/**
 * @Description  生成短的UUID
 * @Author xw
 * @Date 13:21 2020/2/28
 * @Param [args]
 * @return void
 **/
public class UuidUtil {
 
    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 getShortUuid() {
        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();
    }
}

分析:传统的UUID是16进制,只用了数字和6个字母, 生成的UUID是32位的字符。我们可以对32位的16进制,转换为8位的62进制(大小写英文字母、数字)。对原来的UUID每四位进行一个截取并转换为62进制。最后就生成一个8位62进制的UUID。

五、使用 UidGenerator

UidGenerator正是百度开源的一款基于Snowflake雪花算法实现的高性能唯一ID生成器。更详细的情况可以查看github:uid-generator,里面有更详细的介绍文档说明。

Snowflake算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID(long)。

  • sign(1bit): 固定1bit符号标识,即生成的UID为正数。
  • delta seconds (28 bits) :当前时间,相对于时间基点”2016-05-20″的增量值,单位:秒,最多可支持约8.7年。
  • worker id (22 bits) :机器id,最多可支持约420w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。
  • sequence (13 bits) :每秒下的并发序列,13 bits可支持每秒8192个并发。

仓库地址

最后修改日期:2020-07-12

作者

留言

用当前时间戳+用户名+随机数最后md5,这样重复的概率较低。

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。