有時候業務需要生成唯一標識符,但又不能依賴於數據庫中自動遞增的字段產生唯一ID,比如多表同一字段需要統一一個唯一ID,此時我們就需要用程序來生成一個唯一的全局ID。
UUID
- UUID是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。
- 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