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。

image

實現:

#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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM