• 订单唯一标识


    在平常开发系统,设计表结构的时候,常常需要有一个字段来标识该条记录的唯一性,从java层面和数据库层面不同维度来进行实现

    java生成唯一标识

    版本一

    java自带生成唯一标识UUID

    System.out.println(UUID.randomUUID().toString());
    

    输出

    4880d2b4-bc5f-48d1-ba58-003334276d46
    

    明显地看出来太长了而且很不友好

    版本二

    进一步处理生成8位UUID

        public 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 String getShortUuid() {
            StringBuffer stringBuffer = 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 strInteger = Integer.parseInt(str, 16);
                stringBuffer.append(chars[strInteger % 0x3E]);
            }
    
            return stringBuffer.toString();
        }
        @Test
        public void test4(){
            TestDemo2 testDemo2 = new TestDemo2();
            System.out.println(UUID.randomUUID().toString());
            System.out.println(testDemo2.getShortUuid());
        }
    

    输出

    4880d2b4-bc5f-48d1-ba58-003334276d46
    M3EeoAYr
    

    版本三

    时间戳加上生成的8位UUID

        @Test
        public void test3() {
            TestDemo2 testDemo2 = new TestDemo2();
            String shortUuid = testDemo2.getShortUuid();
            String create_time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            System.out.println(create_time+shortUuid);
        }
    

    输出

    20190925101216hh42xxn6
    

    推荐使用时间戳加上生成的8位UUID

    oracle生成唯一标识

    版本一

    序列号生成唯一标识

    创建序列

    -- Create sequence 
    create sequence SEQ_ORDER_ID
    minvalue 100000
    maxvalue 999999
    start with 414591
    increment by 1
    nocache
    cycle;
    
    
    字段 说明
    minvalue 定义序列生成器能产生的最小值
    maxvalue 定义序列生成器能产生的最大值
    start with 定义序列的初始值(即产生的第一个值),默认为1
    increment by 定义序列的步长(增长量),如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的
    nocache 表示不对序列进行内存缓冲
    cycle 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环

    获取序列号

    SELECT SEQ_ORDER_ID.NEXTVAL FROM DUAL;
    

    输出

    414785
    
    

    版本二

    时间戳加上序列号

    SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||SEQ_ORDER_ID.NEXTVAL FROM DUAL;
    
    

    输出

    20190925102115414805
    
    

    推荐使用时间戳加上序列号

  • 相关阅读:
    GC原理---垃圾收集算法
    GC原理---对象可达判断
    散列算法和哈希表结构
    桶排序
    Spring事务梳理
    AQS
    重入锁
    CAS
    研究一下phpspider
    用php写爬虫去爬数据
  • 原文地址:https://www.cnblogs.com/lisingshen/p/11585975.html
Copyright © 2020-2023  润新知