UUID V1 到 V7 各版本详解及 PostgreSQL 中的方法

UUID PostgreSQL Java About 2,389 words

含义

英文全称:Universally Unique Identifier

微软体系中使用:Globally Unique Identifier (GUID)

格式

以连字号分为五段,表现形式为8-4-4-4-1232个字符。

M表示UUID版本,目前是1-7版本。

N表示UUID变体,目前是8/9/a/b四种情况。

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
16095e6a-1c01-11ef-8d8c-de78632ca3f0 -- v1
7f99c45a-1c01-11ef-8d8c-47b90e0f82e8 -- v1mc
efba1db8-0f22-3bcd-954a-a39d36b31eef -- v3
13c508fb-1944-4ca7-957a-2ee41130ac18 -- v4
4acfff1b-ac0e-53d3-baa3-87246d186911 -- v5
1ef1cbff-5179-67ed-ae48-c5359f963ec4 -- v6
018fbe00-fbb2-791e-a519-c815ecea214e -- v7

UUID V1

示例

postgres=# select uuid_generate_v1();
           uuid_generate_v1
--------------------------------------
 16095e6a-1c01-11ef-8d8c-de78632ca3f0
(1 row)

原理

基于时间戳及MAC地址。

缺点

  • 机器的MAC地址出厂后不能保证完全唯一,且之后MAC地址也可手动修改
  • MAC地址的暴露会造成了隐私与安全问题
  • 若一台机器上的两个进程同时跑,有可能出现重复问题

UUID V2

示例

postgres=# select uuid_generate_v1mc();
          uuid_generate_v1mc
--------------------------------------
 7f99c45a-1c01-11ef-8d8c-47b90e0f82e8
(1 row)

原理

基于时间戳,将V1MAC地址改为了随机数,更安全。

UUID V3

示例

postgres=# select uuid_generate_v3(uuid_generate_v1(), 'my-name');
           uuid_generate_v3
--------------------------------------
 efba1db8-0f22-3bcd-954a-a39d36b31eef
(1 row)

原理

不依赖与机器信息和时间信息。

V3要求输入命名空间及名称,命名空间本身也是一个UUID,用来标识应用环境,名称通常是用户账号、用户名之类的内容,通过命名空间、名称、MD5算出UUID

UUID V4

示例

postgres=# select gen_random_uuid();
           gen_random_uuid
--------------------------------------
 13c508fb-1944-4ca7-957a-2ee41130ac18
(1 row)

原理

基于随机数。

UUID V5

示例

postgres=# select uuid_generate_v5(uuid_generate_v1(), 'my-name');
           uuid_generate_v5
--------------------------------------
 4acfff1b-ac0e-53d3-baa3-87246d186911
(1 row)

原理

V3差不多,只是把散列算法的MD5变成SHA1

UUID V6

示例

public static void main(String[] args) {
    UUID uuidV6 = Generators.timeBasedReorderedGenerator().generate();
    System.out.println(uuidV6);
}
// 1ef1cbff-5179-67ed-ae48-c5359f963ec4

原理

V1版本的字段顺序进行了调整。

UUID V7

示例

public static void main(String[] args) {
    UUID uuidV7 = Generators.timeBasedEpochGenerator().generate();
    System.out.println(uuidV7);
}
// 018fbe00-fbb2-791e-a519-c815ecea214e

原理

基于Unix时间戳和随机数。

UUID V7 转为时间

postgres=# SELECT to_timestamp(x'018fb7e95d1e739e92e2f22929a9ae12'::bit(48)::bigint / 1000);
      to_timestamp
------------------------
 2024-05-27 10:37:55+08
(1 row)

UUID V7 Java 生成器

https://github.com/cowtowncoder/java-uuid-generator

WIKI

https://en.wikipedia.org/wiki/Universally_unique_identifier

Views: 307 · Posted: 2024-06-13

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓
Today On History
Browsing Refresh