Whiz Tools

Trình tạo UUID

UUID đã tạo

Cấu trúc UUID
Thời gian thấp

Trình tạo UUID

Giới thiệu

Một Định danh Độc nhất Toàn cầu (UUID) là một số 128-bit được sử dụng để xác định thông tin trong các hệ thống máy tính. UUID được tiêu chuẩn hóa bởi Quỹ Phần mềm Mở (OSF) như một phần của Môi trường Tính toán Phân tán (DCE). Những định danh này được thiết kế để độc nhất trên cả không gian và thời gian, khiến chúng trở nên lý tưởng cho nhiều ứng dụng trong các hệ thống phân tán và hơn thế nữa.

Công cụ tạo UUID này cho phép bạn tạo ra cả UUID phiên bản 1 (dựa trên thời gian) và phiên bản 4 (ngẫu nhiên). Những định danh này hữu ích trong nhiều tình huống mà việc xác định độc nhất là cần thiết, chẳng hạn như khóa cơ sở dữ liệu, hệ thống phân tán và giao thức mạng.

Cách thức hoạt động của UUID

Cấu trúc UUID

Một UUID thường được biểu diễn dưới dạng 32 ký tự thập lục phân, được hiển thị trong năm nhóm phân tách bằng dấu gạch ngang, theo hình thức 8-4-4-4-12, tổng cộng là 36 ký tự (32 ký tự alphanumeric và 4 dấu gạch ngang). Ví dụ:

550e8400-e29b-41d4-a716-446655440000

128 bit của một UUID được chia thành các trường cụ thể, mỗi trường mang thông tin khác nhau tùy thuộc vào phiên bản UUID:

  • 32 bit cho trường time_low
  • 16 bit cho trường time_mid
  • 16 bit cho trường time_hi_and_version
  • 8 bit cho trường clock_seq_hi_and_reserved
  • 8 bit cho trường clock_seq_low
  • 48 bit cho trường node

Dưới đây là một sơ đồ minh họa cấu trúc UUID:

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

Các phiên bản UUID

Có nhiều phiên bản UUID, mỗi phiên bản có phương pháp tạo riêng:

  1. Phiên bản 1 (Dựa trên thời gian): Sử dụng dấu thời gian hiện tại và địa chỉ MAC của máy tính.
  2. Phiên bản 2 (Bảo mật DCE): Tương tự như phiên bản 1, nhưng bao gồm một định danh miền địa phương.
  3. Phiên bản 3 (Dựa trên tên, MD5): Được tạo ra bằng cách băm một định danh không gian tên và tên.
  4. Phiên bản 4 (Ngẫu nhiên): Được tạo ra bằng cách sử dụng một số ngẫu nhiên hoặc giả ngẫu nhiên.
  5. Phiên bản 5 (Dựa trên tên, SHA-1): Tương tự như phiên bản 3, nhưng sử dụng băm SHA-1.

Công cụ này tập trung vào việc tạo ra UUID phiên bản 1 và phiên bản 4.

Công thức

Tạo UUID phiên bản 1

UUID phiên bản 1 được tạo ra bằng cách sử dụng các thành phần sau:

  1. Dấu thời gian: Một giá trị 60 bit đại diện cho số lượng khoảng thời gian 100 nanosecond kể từ ngày 15 tháng 10 năm 1582 (ngày cải cách Gregorian đối với lịch Kitô giáo).
  2. Chuỗi đồng hồ: Một giá trị 14 bit được sử dụng để tránh trùng lặp trong trường hợp đồng hồ được đặt lại.
  3. Node: Một giá trị 48 bit, thường được lấy từ địa chỉ MAC của máy tính.

Công thức để tạo UUID phiên bản 1 có thể được biểu diễn như sau:

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

Tạo UUID phiên bản 4

UUID phiên bản 4 được tạo ra bằng cách sử dụng một bộ sinh số ngẫu nhiên mạnh mẽ về mặt mật mã. Công thức là đơn giản:

UUID = random_128_bit_number

Với các bit cụ thể được đặt để chỉ định phiên bản (4) và biến thể.

Các trường hợp sử dụng

UUID có nhiều ứng dụng trong các lĩnh vực khác nhau của khoa học máy tính và kỹ thuật phần mềm:

  1. Khóa cơ sở dữ liệu: UUID thường được sử dụng làm khóa chính trong các cơ sở dữ liệu, đặc biệt trong các hệ thống phân tán nơi nhiều nút có thể tạo ra bản ghi đồng thời.

  2. Hệ thống phân tán: Trong các hệ thống phân tán quy mô lớn, UUID giúp xác định độc nhất các tài nguyên, giao dịch hoặc sự kiện trên nhiều nút hoặc trung tâm dữ liệu.

  3. Địa chỉ nội dung: UUID có thể được sử dụng để tạo ra các định danh độc nhất cho nội dung trong các hệ thống lưu trữ dựa trên địa chỉ nội dung.

  4. Quản lý phiên: Các ứng dụng web thường sử dụng UUID để quản lý phiên người dùng, đảm bảo mỗi phiên đều có một định danh độc nhất.

  5. Xác định thiết bị IoT: Trong các ứng dụng Internet of Things (IoT), UUID có thể được sử dụng để xác định độc nhất từng thiết bị trong một mạng.

Các phương pháp thay thế

Mặc dù UUID được sử dụng rộng rãi, vẫn có các phương pháp thay thế để tạo ra các định danh độc nhất:

  1. ID tự tăng: Đơn giản và thường được sử dụng trong các hệ thống cơ sở dữ liệu đơn, nhưng không phù hợp cho các môi trường phân tán.

  2. ID dựa trên thời gian: Có thể hữu ích cho dữ liệu theo thứ tự thời gian nhưng có thể gặp vấn đề trùng lặp trong các kịch bản có độ đồng thời cao.

  3. ID Snowflake: Được phát triển bởi Twitter, các ID này kết hợp dấu thời gian và số công nhân để tạo ra ID độc nhất trong các hệ thống phân tán.

  4. ULID (Định danh Độc nhất Toàn cầu Có thể Sắp xếp): Một phương pháp thay thế gần đây hơn nhằm trở nên thân thiện hơn với con người và có thể sắp xếp hơn so với UUID.

Lịch sử

Khái niệm UUID lần đầu tiên được giới thiệu trong Hệ thống Máy tính Mạng Apollo và sau đó được tiêu chuẩn hóa bởi Quỹ Phần mềm Mở (OSF) như một phần của Môi trường Tính toán Phân tán (DCE) vào những năm 1990. Đặc tả ban đầu được công bố vào năm 1997 dưới dạng ISO/IEC 11578:1996 và sau đó được sửa đổi vào năm 2005 như một phần của ISO/IEC 9834-8:2005.

Các cột mốc quan trọng trong lịch sử UUID:

  • Những năm 1980: Apollo Computer phát triển khái niệm UUID cho Hệ thống Máy tính Mạng của họ.
  • 1997: Đặc tả UUID đầu tiên được công bố dưới dạng ISO/IEC 11578:1996.
  • 2005: Đặc tả UUID được sửa đổi và công bố như một phần của ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 định nghĩa định dạng UUID và các thuật toán tạo được sử dụng ngày nay.

Theo thời gian, UUID đã trở thành một công cụ thiết yếu trong các hệ thống phân tán và thiết kế cơ sở dữ liệu, với nhiều triển khai và điều chỉnh trên các ngôn ngữ lập trình và nền tảng khác nhau.

Ví dụ mã

Dưới đây là các ví dụ về việc tạo UUID trong các ngôn ngữ lập trình khác nhau:

import uuid

## Tạo một UUID phiên bản 4 (ngẫu nhiên)
random_uuid = uuid.uuid4()
print(f"UUID phiên bản 4: {random_uuid}")

## Tạo một UUID phiên bản 1 (dựa trên thời gian)
time_based_uuid = uuid.uuid1()
print(f"UUID phiên bản 1: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Tạo một UUID phiên bản 4 (ngẫu nhiên)
const randomUuid = uuidv4();
console.log(`UUID phiên bản 4: ${randomUuid}`);

// Tạo một UUID phiên bản 1 (dựa trên thời gian)
const timeBasedUuid = uuidv1();
console.log(`UUID phiên bản 1: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Tạo một UUID phiên bản 4 (ngẫu nhiên)
        UUID randomUuid = UUID.randomUUID();
        System.out.println("UUID phiên bản 4: " + randomUuid);

        // Tạo một UUID phiên bản 1 (dựa trên thời gian)
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("UUID phiên bản 1: " + timeBasedUuid);
    }
}
require 'securerandom'

## Tạo một UUID phiên bản 4 (ngẫu nhiên)
random_uuid = SecureRandom.uuid
puts "UUID phiên bản 4: #{random_uuid}"

## Ruby không có phương thức tích hợp để tạo UUID phiên bản 1
## Bạn sẽ cần sử dụng một gem như 'uuidtools' cho điều đó
<?php
// Tạo một UUID phiên bản 4 (ngẫu nhiên)
$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 "UUID phiên bản 4: " . $randomUuid . "\n";

// PHP không có phương thức tích hợp để tạo UUID phiên bản 1
// Bạn sẽ cần sử dụng một thư viện như 'ramsey/uuid' cho điều đó
?>

Tài liệu tham khảo

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. Tổ chức Tiêu chuẩn hóa Quốc tế. (2005). Công nghệ thông tin – Kết nối Hệ thống Mở – Thủ tục cho việc vận hành các Cơ quan Đăng ký OSI: Tạo và đăng ký Định danh Độc nhất Toàn cầu (UUID) và việc sử dụng chúng như các thành phần Định danh Đối tượng ASN.1. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Định danh độc nhất toàn cầu. (2023). Trong Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. ID Snowflake. (2023). Trong Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. ULID Spec. (n.d.). GitHub. https://github.com/ulid/spec
Feedback