zoukankan      html  css  js  c++  java
  • Java中生成唯一标识符的方法(Day_48)

    有时候业务需要生成唯一标识符,但又不能依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,此时我们就需要用程序来生成一个唯一的全局ID。

    UUID

    1. UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
    2. UUID是一个128bit的数字,也可以表现为32个16进制的字符(每个字符0-F的字符代表4bit),中间用"-"分割。
    • 时间戳+UUID版本号: 分三段占16个字符(60bit+4bit),
    • Clock Sequence号与保留字段:占4个字符(13bit+3bit),
    • 节点标识:占12个字符(48bit),

    UUID的唯一缺陷在于生成的结果串会比较长。

    public static void main(String[] args) {
            String fileName= java.util.UUID.randomUUID().toString();
            System.out.println(fileName);
        }
    
    执行结果:  857fd8e6-6f42-4a98-97bb-f86a5175d307
    

    SnowFlake实现唯一标识码

    SnowFlake是推特开源分布式自增ID算法。

    • 符号位(1bit):用于区分正负数。1为负数,0为整数。一般不需要负数,所以值固定为0。
    • 时间戳(41bit) :一共预留41bit保存毫秒级时间戳。
    • 自增序列号(12bit,最大值4096):毫秒之内的自增,过了一毫秒会重新置0。
    • 工作机器:预留了10bit保存机器ID。只要机器ID不一样,每毫秒生成的ID是不一样的。一共可以支持1023台机器同时生成ID。

    image

    实现:

    #include <stdio.h>
    
    int main()
    {
    	long long id;
    	id = 1572057648000 << 22; //相当于 id = 1572057648000 << 22 | 0 << 12 | 0;
        printf("id=%lld
    ", id);
       
       return 0;
    }
    

    结果:

    id=6593687681236992000
    
  • 相关阅读:
    Shell 丢弃错误和输出信息
    awk 循环过滤EPC脚本
    Tornado 异步浅解
    返回顶部
    Tornado 的安全性保障机制Cookie XSRF跨站请求伪造阻断 &用户验证机制
    Nginxre quest_time 和upstream_response_time
    Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
    Tornado WEB服务器框架 Epoll-- 【模板】
    常见的SQL等价改写
    redis配置信息详解
  • 原文地址:https://www.cnblogs.com/papercy/p/14707979.html
Copyright © 2011-2022 走看看