Whiz Tools

UUID 生成器

生成的 UUID

UUID 结构
时间低位

UUID 生成器

引言

通用唯一标识符 (UUID) 是一种 128 位数字,用于在计算机系统中标识信息。UUID 由开放软件基金会 (OSF) 标准化,作为分布式计算环境 (DCE) 的一部分。这些标识符旨在在空间和时间上都是唯一的,使其非常适合在分布式系统及其他应用中的各种场景。

此 UUID 生成器工具允许您创建版本 1(基于时间)和版本 4(随机)UUID。这些标识符在需要唯一标识的各种场景中非常有用,例如数据库键、分布式系统和网络协议。

UUID 的工作原理

UUID 结构

UUID 通常表示为 32 个十六进制数字,显示为五组,用连字符分隔,形式为 8-4-4-4-12,总共 36 个字符(32 个字母数字字符和 4 个连字符)。例如:

550e8400-e29b-41d4-a716-446655440000

UUID 的 128 位被分为特定字段,每个字段根据 UUID 版本携带不同的信息:

  • 32 位用于 time_low 字段
  • 16 位用于 time_mid 字段
  • 16 位用于 time_hi_and_version 字段
  • 8 位用于 clock_seq_hi_and_reserved 字段
  • 8 位用于 clock_seq_low 字段
  • 48 位用于 node 字段

以下是说明 UUID 结构的图示:

A B C D E F A: time_low (32 位) B: time_mid (16 位) C: time_hi_and_version (16 位) D: clock_seq_hi_and_reserved (8 位) E: clock_seq_low (8 位) F: node (48 位)

UUID 版本

UUID 有几个版本,每个版本都有其自己的生成方法:

  1. 版本 1(基于时间):使用当前时间戳和计算机的 MAC 地址。
  2. 版本 2(DCE 安全):类似于版本 1,但包含本地域标识符。
  3. 版本 3(基于名称,MD5):通过对命名空间标识符和名称进行哈希生成。
  4. 版本 4(随机):使用随机或伪随机数生成。
  5. 版本 5(基于名称,SHA-1):类似于版本 3,但使用 SHA-1 哈希。

此工具专注于生成版本 1 和版本 4 UUID。

公式

版本 1 UUID 生成

版本 1 UUID 的生成使用以下组件:

  1. 时间戳:一个 60 位值,表示自 1582 年 10 月 15 日(格里历改革的日期)以来的 100 纳秒间隔数。
  2. 时钟序列:一个 14 位值,用于避免在时钟向后设置时的重复。
  3. 节点:一个 48 位值,通常来自计算机的 MAC 地址。

生成版本 1 UUID 的公式可以表示为:

UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node

版本 4 UUID 生成

版本 4 UUID 是使用加密强随机数生成器生成的。公式简单为:

UUID = random_128_bit_number

特定位被设置为指示版本(4)和变体。

用例

UUID 在计算机科学和软件工程的各个领域有许多应用:

  1. 数据库键:UUID 通常用作数据库中的主键,尤其是在多个节点可能同时生成记录的分布式系统中。

  2. 分布式系统:在大规模分布式系统中,UUID 有助于唯一标识多个节点或数据中心中的资源、事务或事件。

  3. 内容寻址:UUID 可用于在内容寻址存储系统中创建内容的唯一标识符。

  4. 会话管理:Web 应用程序通常使用 UUID 来管理用户会话,确保每个会话都有唯一标识符。

  5. 物联网设备识别:在物联网 (IoT) 应用中,UUID 可用于唯一标识网络中的单个设备。

替代方案

虽然 UUID 被广泛使用,但还有其他生成唯一标识符的方法:

  1. 自增 ID:简单且常用于单一数据库系统,但不适合分布式环境。

  2. 基于时间的 ID:对于时间顺序数据可能有用,但在高并发场景中可能面临冲突问题。

  3. 雪花 ID:由 Twitter 开发,这些 ID 结合了时间戳和工作编号,以在分布式系统中生成唯一 ID。

  4. ULID(通用唯一按字典顺序可排序标识符):一种较新的替代方案,旨在比 UUID 更加人性化和可排序。

历史

UUID 的概念最早是在阿波罗网络计算系统中引入的,后来在 1990 年代由开放软件基金会 (OSF) 标准化。最初的规范于 1997 年作为 ISO/IEC 11578:1996 发布,随后在 2005 年作为 ISO/IEC 9834-8:2005 修订。

UUID 历史上的关键里程碑:

  • 1980 年代:阿波罗计算机为其网络计算系统开发 UUID 概念。
  • 1997 年:第一个 UUID 规范作为 ISO/IEC 11578:1996 发布。
  • 2005 年:UUID 规范修订并作为 ISO/IEC 9834-8:2005 发布。
  • 2009 年:RFC 4122 定义了今天使用的 UUID 格式和生成算法。

随着时间的推移,UUID 已成为分布式系统和数据库设计中的重要工具,在不同编程语言和平台中有各种实现和适应。

代码示例

以下是用各种编程语言生成 UUID 的示例:

import uuid

## 生成版本 4(随机)UUID
random_uuid = uuid.uuid4()
print(f"版本 4 UUID: {random_uuid}")

## 生成版本 1(基于时间)UUID
time_based_uuid = uuid.uuid1()
print(f"版本 1 UUID: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// 生成版本 4(随机)UUID
const randomUuid = uuidv4();
console.log(`版本 4 UUID: ${randomUuid}`);

// 生成版本 1(基于时间)UUID
const timeBasedUuid = uuidv1();
console.log(`版本 1 UUID: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // 生成版本 4(随机)UUID
        UUID randomUuid = UUID.randomUUID();
        System.out.println("版本 4 UUID: " + randomUuid);

        // 生成版本 1(基于时间)UUID
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("版本 1 UUID: " + timeBasedUuid);
    }
}
require 'securerandom'

## 生成版本 4(随机)UUID
random_uuid = SecureRandom.uuid
puts "版本 4 UUID: #{random_uuid}"

## Ruby 没有内置方法生成版本 1 UUID
## 您需要使用像 'uuidtools' 这样的 gem 来实现
<?php
// 生成版本 4(随机)UUID
$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
echo "版本 4 UUID: " . $randomUuid . "\n";

// PHP 没有内置方法生成版本 1 UUID
// 您需要使用像 'ramsey/uuid' 这样的库来实现
?>

参考文献

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. 国际标准化组织. (2005). 信息技术 – 开放系统互联 – OSI 注册机构操作程序:通用唯一标识符 (UUID) 的生成和注册及其作为 ASN.1 对象标识符组件的使用。ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. 通用唯一标识符. (2023). 在维基百科中. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. 雪花 ID. (2023). 在维基百科中. https://en.wikipedia.org/wiki/Snowflake_ID
  5. ULID 规范. (n.d.). GitHub. https://github.com/ulid/spec
Feedback