有時候業務需要生成唯一辨別符,但又不能依賴于資料庫中自動遞增的字段産生唯一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