订单唯一标识

Posted by 小兵兵 on Wednesday, September 25, 2019

目录

在平常开发系统,设计表结构的时候,常常需要有一个字段来标识该条记录的唯一性,从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

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

弹力设计篇之“幂等性设计”

参考

https://time.geekbang.org/column/article/4050