为各种应用生成全球唯一标识符(UUID)。创建版本 1(基于时间)和版本 4(随机)UUID,用于分布式系统、数据库等。
通用唯一标识符 (UUID) 是一种 128 位数字,用于在计算机系统中标识信息。UUID 由开放软件基金会 (OSF) 标准化,作为分布式计算环境 (DCE) 的一部分。这些标识符旨在在空间和时间上都是唯一的,使其非常适合在分布式系统及其他应用中的各种场景。
此 UUID 生成器工具允许您创建版本 1(基于时间)和版本 4(随机)UUID。这些标识符在需要唯一标识的各种场景中非常有用,例如数据库键、分布式系统和网络协议。
UUID 通常表示为 32 个十六进制数字,显示为五组,用连字符分隔,形式为 8-4-4-4-12,总共 36 个字符(32 个字母数字字符和 4 个连字符)。例如:
1550e8400-e29b-41d4-a716-446655440000
2
UUID 的 128 位被分为特定字段,每个字段根据 UUID 版本携带不同的信息:
以下是说明 UUID 结构的图示:
UUID 有几个版本,每个版本都有其自己的生成方法:
此工具专注于生成版本 1 和版本 4 UUID。
版本 1 UUID 的生成使用以下组件:
生成版本 1 UUID 的公式可以表示为:
1UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node
2
版本 4 UUID 是使用加密强随机数生成器生成的。公式简单为:
1UUID = random_128_bit_number
2
特定位被设置为指示版本(4)和变体。
UUID 在计算机科学和软件工程的各个领域有许多应用:
数据库键:UUID 通常用作数据库中的主键,尤其是在多个节点可能同时生成记录的分布式系统中。
分布式系统:在大规模分布式系统中,UUID 有助于唯一标识多个节点或数据中心中的资源、事务或事件。
内容寻址:UUID 可用于在内容寻址存储系统中创建内容的唯一标识符。
会话管理:Web 应用程序通常使用 UUID 来管理用户会话,确保每个会话都有唯一标识符。
物联网设备识别:在物联网 (IoT) 应用中,UUID 可用于唯一标识网络中的单个设备。
虽然 UUID 被广泛使用,但还有其他生成唯一标识符的方法:
自增 ID:简单且常用于单一数据库系统,但不适合分布式环境。
基于时间的 ID:对于时间顺序数据可能有用,但在高并发场景中可能面临冲突问题。
雪花 ID:由 Twitter 开发,这些 ID 结合了时间戳和工作编号,以在分布式系统中生成唯一 ID。
ULID(通用唯一按字典顺序可排序标识符):一种较新的替代方案,旨在比 UUID 更加人性化和可排序。
UUID 的概念最早是在阿波罗网络计算系统中引入的,后来在 1990 年代由开放软件基金会 (OSF) 标准化。最初的规范于 1997 年作为 ISO/IEC 11578:1996 发布,随后在 2005 年作为 ISO/IEC 9834-8:2005 修订。
UUID 历史上的关键里程碑:
随着时间的推移,UUID 已成为分布式系统和数据库设计中的重要工具,在不同编程语言和平台中有各种实现和适应。
以下是用各种编程语言生成 UUID 的示例:
1import uuid
2
3## 生成版本 4(随机)UUID
4random_uuid = uuid.uuid4()
5print(f"版本 4 UUID: {random_uuid}")
6
7## 生成版本 1(基于时间)UUID
8time_based_uuid = uuid.uuid1()
9print(f"版本 1 UUID: {time_based_uuid}")
10
1const { v1: uuidv1, v4: uuidv4 } = require('uuid');
2
3// 生成版本 4(随机)UUID
4const randomUuid = uuidv4();
5console.log(`版本 4 UUID: ${randomUuid}`);
6
7// 生成版本 1(基于时间)UUID
8const timeBasedUuid = uuidv1();
9console.log(`版本 1 UUID: ${timeBasedUuid}`);
10
1import java.util.UUID;
2
3public class UuidGenerator {
4 public static void main(String[] args) {
5 // 生成版本 4(随机)UUID
6 UUID randomUuid = UUID.randomUUID();
7 System.out.println("版本 4 UUID: " + randomUuid);
8
9 // 生成版本 1(基于时间)UUID
10 UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
11 System.out.println("版本 1 UUID: " + timeBasedUuid);
12 }
13}
14
1require 'securerandom'
2
3## 生成版本 4(随机)UUID
4random_uuid = SecureRandom.uuid
5puts "版本 4 UUID: #{random_uuid}"
6
7## Ruby 没有内置方法生成版本 1 UUID
8## 您需要使用像 'uuidtools' 这样的 gem 来实现
9
1<?php
2// 生成版本 4(随机)UUID
3$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
4 mt_rand(0, 0xffff), mt_rand(0, 0xffff),
5 mt_rand(0, 0xffff),
6 mt_rand(0, 0x0fff) | 0x4000,
7 mt_rand(0, 0x3fff) | 0x8000,
8 mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
9);
10echo "版本 4 UUID: " . $randomUuid . "\n";
11
12// PHP 没有内置方法生成版本 1 UUID
13// 您需要使用像 'ramsey/uuid' 这样的库来实现
14?>
15