有时候业务需要生成唯一标识符,但又不能依赖于数据库中自动递增的字段产生唯一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。

实现:

#include <stdio.h>

int main()
{
long long id;
id = 1572057648000 << 22; //相当于 id = 1572057648000 << 22 | 0 << 12 | 0;
printf("id=%lld\n", id); return 0;
}

结果:

id=6593687681236992000

最新文章

  1. ajax请求action返回json数据
  2. CSS手动改变DIV高宽
  3. javascript基础07
  4. Java8简明教程(转载)
  5. jquery ajax给外部变量赋值 async: false
  6. 如何使用emacs编写c语言程序,并编译运行
  7. Android studio设置参数提示
  8. HTTP的报文格式,GET和POST的区别
  9. 矩阵链乘 hrbust 1600
  10. Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
  11. table+js实现网站左侧列表下拉隐藏
  12. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
  13. 单元测试(Spring)
  14. Discuz插件开发之全站论坛目录结构注释
  15. FSharp 调用 Oracle.ManagedDataAccess.dll
  16. 从零开始学安全(三十六)●利用python 爆破form表单
  17. iOS开发创建UI的耗时操作处理
  18. rabbitMQ 的三种Exchange
  19. WorkStation 虚拟机迁移到 ESXi的后续处理.
  20. 1076 Wifi密码

热门文章

  1. 【笔记】《Redis设计与实现》chapter11 AOF持久化
  2. kubernetes集群证书更新
  3. kuberadm安装kubernetes
  4. java面试一日一题:mysql中的自增主键
  5. UT之最后一测
  6. IDEA常用个性化设置
  7. 1038 Recover the Smallest Number
  8. E - Level K Palindrome
  9. hdu 1044 BFS(压缩图)+DFS
  10. POJ2406 KMP前缀周期