Java生成主键ID

当数据库进行分库分表的时候, 原有的主键自增就会不方便继续使用了, 这个时候我们就可以用Java代码来处理主键, 然后插入到数据库中

UUID

最容易让人想到的就是UUID(Universally Unique Identifier)通用唯一标识符.
UUID的标准型式包括了32个16进制的数字, 以连字号分为五段, 形式为8-4-4-4-12的36个字符, 这个是Java自带的, 使用方便简单.
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.
当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得).

优点:本地生成, 没有网络消耗

缺点

  • 字符串太长, mysql官方明确建议主键要尽量越短越好
  • UUID的随机性对于 I/O密集型的应用非常不友好, 它会使得聚簇索引的插入变得完全随机, 使得数据没有任何聚集特征
  • 信息不安全: UUID基于MAC地址生成UUID的算法可能会造成MAC地址泄露, 这个漏洞曾被用于寻找梅丽莎病毒的制作者位置
  • 对mysql索引不好: 如果作为数据库主键, 在InnoDB引擎下, UUID的无序性有可能会引起数据位置频繁变动, 严重影响性能
  • 因此UUID并非最佳方案

    实现

    如果使用的JDK为1.5的话, 那么可以直接调用java.util.UUID 即可
    生成uuid数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Test
    public void uuidID() {
    // uuid生成32位数
    String uuid = UUID.randomUUID().toString().replace("-", "");
    System.out.println(uuid);

    // 截取前面或者后面16位
    String substring = uuid.substring(0, 16);
    System.out.println(substring);
    }

    LEAF