Hướng dẫn

Hướng dẫn UUID: Phiên bản và cách sử dụng

UUID (Universally Unique Identifiers) là định danh 128-bit được sử dụng để nhận dạng thông tin duy nhất trong hệ thống máy tính. Chúng rất quan trọng trong cơ sở dữ liệu phân tán, API, và bất kỳ hệ thống nào cần tạo định danh duy nhất mà không có phối hợp trung tâm.

UUID là gì và tại sao sử dụng chúng?

UUID là định danh 128-bit thường được hiển thị dưới dạng 32 ký tự thập lục phân được nhóm theo các gạch nối: 550e8400-e29b-41d4-a716-446655440000. Định dạng cung cấp 2^128 (khoảng 340 undecillion) giá trị khả dĩ—thực tế vô hạn cho các mục đích thực tế. Lợi ích chính của UUID là tính duy nhất toàn cầu mà không cần phối hợp trung tâm. Không giống như các khóa tự tăng trong cơ sở dữ liệu yêu cầu máy chủ trung tâm gán ID, UUID có thể được tạo độc lập bởi bất kỳ hệ thống nào với xác suất va chạm gần như bằng không. Điều này làm cho chúng lý tưởng cho các hệ thống phân tán, nơi nhiều máy chủ cần tạo ID mà không cần liên lạc với nhau. UUID đặc biệt hữu ích trong microservices nơi các dịch vụ khác nhau cần tạo ID cho các thực thể của chúng. Mỗi dịch vụ có thể tạo UUID mà không sợ xung đột với các dịch vụ khác. Điều này đơn giản hóa kiến trúc và loại bỏ các điểm lỗi đơn. Trong API và tích hợp bên ngoài, UUID cung cấp ID không thể đoán được. Không giống như các khóa tuần tự (1, 2, 3...) mà người dùng có thể đoán để truy cập tài nguyên khác, UUID như 550e8400-e29b-41d4-a716-446655440000 về cơ bản là không thể đoán được. Mặc dù không nên là lớp bảo mật duy nhất, điều này cung cấp tính mờ thông qua. UUID tạo điều kiện cho việc hợp nhất dữ liệu từ nhiều nguồn. Khi kết hợp cơ sở dữ liệu từ các hệ thống khác nhau, các khóa tự tăng xung đột. UUID duy trì tính duy nhất của chúng trên các hệ thống, làm cho việc hợp nhất trở nên đơn giản. Tuy nhiên, UUID có những nhược điểm. Chúng lớn hơn các số nguyên—128 bit so với 32 hoặc 64 bit. Chúng ít thân thiện với con người—so sánh 550e8400-e29b-41d4-a716-446655440000 với "123". Trong cơ sở dữ liệu, việc lập chỉ mục UUID có thể kém hiệu quả hơn các số nguyên tuần tự vì tính ngẫu nhiên của chúng làm giảm hiệu suất bộ nhớ đệm. Mặc dù có những nhược điểm này, lợi ích thường vượt trội cho các hệ thống hiện đại.

Các phiên bản UUID: V1, V4, V5

Đặc tả UUID định nghĩa một số phiên bản, mỗi phiên bản có các thuộc tính và trường hợp sử dụng khác nhau. Hiểu sự khác biệt giúp chọn phiên bản phù hợp cho nhu cầu của bạn. UUID Version 1 (dựa trên thời gian): UUID v1 kết hợp dấu thời gian hiện tại với địa chỉ MAC của máy. Điều này đảm bảo tính duy nhất vì không có hai máy có cùng địa chỉ MAC và không có thời gian nào lặp lại. UUID v1 có thuộc tính hữu ích về mặt sắp xếp theo thời gian—UUID mới hơn sắp xếp sau UUID cũ hơn. Tuy nhiên, chúng tiết lộ địa chỉ MAC của máy tạo, có thể là mối quan tâm về quyền riêng tư. Chúng cũng tiết lộ thời điểm UUID được tạo. Sử dụng v1 khi bạn cần ID có thể sắp xếp theo thời gian và quyền riêng tư không phải là mối quan tâm. UUID Version 4 (ngẫu nhiên): UUID v4 được tạo ngẫu nhiên (hoặc giả ngẫu nhiên). Hầu hết 128 bit là ngẫu nhiên, chỉ với một vài bit được dành riêng để chỉ định phiên bản và biến thể. UUID v4 là phiên bản được sử dụng rộng rãi nhất vì sự đơn giản và quyền riêng tư của chúng—chúng không tiết lộ bất kỳ thông tin nào về máy hoặc thời gian tạo. Xác suất va chạm là vô cùng nhỏ—bạn có thể tạo hàng tỷ UUID v4 trước khi có xác suất va chạm đáng kể. Sử dụng v4 cho hầu hết các trường hợp sử dụng chung nơi bạn cần ID duy nhất, không thể đoán được. UUID Version 5 (dựa trên không gian tên): UUID v5 được tạo bằng cách băm một không gian tên và một tên với SHA-1. Cho cùng một không gian tên và tên, bạn luôn nhận được cùng một UUID—chúng là xác định. Điều này hữu ích khi bạn cần tạo cùng một UUID từ cùng một đầu vào trên các hệ thống khác nhau. Ví dụ, nếu bạn muốn tạo UUID cho một URL, sử dụng không gian tên URL và URL làm tên sẽ luôn tạo ra cùng một UUID cho URL đó. Sử dụng v5 khi bạn cần ID xác định dựa trên một số định danh hiện có. UUID Version 3 tương tự như v5 nhưng sử dụng MD5 thay vì SHA-1. V5 được ưu tiên hơn v3 vì MD5 có các điểm yếu bảo mật đã biết, mặc dù cho mục đích UUID những điểm yếu này ít liên quan hơn. UUID Version 2 hiếm khi được sử dụng và liên quan đến bảo mật DCE. Hầu hết các ứng dụng nên bám vào v1, v4, hoặc v5.

Thực hành tốt nhất cho UUID

Chọn phiên bản UUID phù hợp phụ thuộc vào yêu cầu của bạn. Đối với hầu hết các trường hợp sử dụng chung, UUID v4 là lựa chọn mặc định an toàn. Chúng đơn giản, an toàn về mặt quyền riêng tư, và có tính ngẫu nhiên tuyệt vời. Sử dụng chúng cho khóa chính cơ sở dữ liệu, ID phiên, token, và bất kỳ tình huống nào bạn cần định danh duy nhất, không thể đoán được. Khi lưu trữ UUID trong cơ sở dữ liệu, xem xét cẩn thận loại cơ sở dữ liệu. PostgreSQL có kiểu UUID gốc hiệu quả lưu trữ UUID ở định dạng nhị phân 128-bit. MySQL có thể lưu trữ UUID dưới dạng BINARY(16) hoặc CHAR(36). Lưu trữ nhị phân hiệu quả hơn về không gian và hiệu suất, nhưng lưu trữ văn bản dễ đọc hơn cho con người trong các công cụ quản trị. Để biết hiệu suất chỉ mục, hãy cẩn thận với UUID ngẫu nhiên. Tính ngẫu nhiên của UUID v4 có nghĩa là các hàng mới có thể được chèn bất cứ đâu trong chỉ mục B-tree, gây ra phân mảnh chỉ mục và hiệu suất ghi kém hơn so với khóa tuần tự. Một số cơ sở dữ liệu cung cấp UUID có thể sắp xếp theo thời gian hoặc "ULID" (Universally Unique Lexicographically Sortable Identifiers) làm thỏa hiệp—duy nhất như UUID nhưng có thể sắp xếp như khóa tuần tự. Khi hiển thị UUID cho người dùng cuối, xem xét hiển thị một phần. UUID đầy đủ dài dòng và khó đọc. Đối với mục đích hiển thị, chỉ hiển thị 8 ký tự đầu thường đủ: 550e8400... thay vì 550e8400-e29b-41d4-a716-446655440000. Luôn sử dụng UUID đầy đủ trong nội bộ và API. Tạo UUID phía client so với phía server phụ thuộc vào kiến trúc của bạn. Các ứng dụng hiện đại thường tạo UUID phía client (trình duyệt hoặc ứng dụng di động) trước khi gửi dữ liệu đến máy chủ. Điều này cho phép tạo lạc quan—client có thể tham chiếu thực thể bằng UUID của nó ngay lập tức mà không cần chờ phản hồi của máy chủ. Đảm bảo trình tạo phía client của bạn sử dụng nguồn ngẫu nhiên an toàn mật mã. Xác thực UUID khi nhận chúng từ các nguồn bên ngoài. Kiểm tra chúng khớp với định dạng UUID (8-4-4-4-12 ký tự hex). Xác minh bit phiên bản và biến thể đúng. Điều này ngăn chặn lỗi từ UUID bị hỏng hoặc được tạo không đúng cách. Hầu hết các thư viện cung cấp hàm xác thực. Đối với ghi nhật ký và debug, hãy xem xét bao gồm phần của UUID trong thông điệp nhật ký thay vì số nguyên đầy đủ. Điều này làm cho nhật ký dễ đọc hơn trong khi vẫn cho phép tương quan. Sử dụng format như "Đã tạo đơn hàng 550e8400" thay vì "Đã tạo đơn hàng 550e8400-e29b-41d4-a716-446655440000". Tài liệu hóa lựa chọn phiên bản UUID của bạn trong hướng dẫn API và tài liệu hệ thống. Client cần biết liệu UUID có thể sắp xếp theo thời gian không (v1), hoàn toàn ngẫu nhiên (v4), hay xác định (v5). Điều này ảnh hưởng đến cách họ có thể sử dụng UUID—ví dụ, phân trang dựa trên UUID chỉ hoạt động đáng tin cậy với UUID có thể sắp xếp.

Thử công cụ

Tạo UUID

Tạo UUID

Tìm hiểu thêm

Câu hỏi thường gặp

Tạo UUID

Câu hỏi thường gặp