天天看點

Java中生成唯一辨別符的方法

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

實作:

#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