Whiz Tools

Trình tạo CUID

Tạo một ID chống va chạm nhanh chóng và dễ dàng.

Cấu trúc CUID

Dấu thời gian:

Ngẫu nhiên:

Bộ Tạo CUID

Giới thiệu

CUID (Collision-resistant Unique IDentifier) là một định danh duy nhất được thiết kế để chống va chạm, có thể mở rộng theo chiều ngang và có thể sắp xếp theo thứ tự tuần tự. CUID đặc biệt hữu ích trong các hệ thống phân tán, nơi cần tạo ra các định danh duy nhất mà không cần phối hợp giữa các nút.

Cấu trúc của CUID

Một CUID thường bao gồm các thành phần sau:

  1. Dấu thời gian: Một đại diện của thời gian hiện tại
  2. Bộ đếm: Một bộ đếm tuần tự để đảm bảo tính duy nhất trong cùng một mili giây
  3. Dấu vân tay của máy khách: Một định danh duy nhất cho máy hoặc quy trình tạo ra CUID
  4. Thành phần ngẫu nhiên: Dữ liệu ngẫu nhiên bổ sung để giảm khả năng va chạm

Cấu trúc chính xác có thể thay đổi tùy thuộc vào việc triển khai CUID, nhưng các thành phần này làm việc cùng nhau để tạo ra một định danh duy nhất và có thể sắp xếp theo thứ tự.

Dưới đây là một hình ảnh minh họa cho cấu trúc CUID điển hình:

Dấu thời gian Bộ đếm Dấu vân tay Ngẫu nhiên

Cách CUID được tạo ra

CUID được tạo ra bằng cách sử dụng sự kết hợp của các thành phần dựa trên thời gian và ngẫu nhiên. Quá trình thường bao gồm:

  1. Lấy dấu thời gian hiện tại
  2. Tăng bộ đếm (được đặt lại theo chu kỳ)
  3. Tạo dấu vân tay của máy khách (thường thực hiện một lần cho mỗi phiên hoặc khi ứng dụng khởi động)
  4. Thêm dữ liệu ngẫu nhiên
  5. Kết hợp các yếu tố này theo một định dạng cụ thể

CUID kết quả thường được biểu diễn dưới dạng một chuỗi các chữ cái và số.

Ưu điểm và Trường hợp sử dụng

CUID mang lại nhiều lợi thế hơn các hệ thống định danh duy nhất khác:

  1. Kháng va chạm: Sự kết hợp của dấu thời gian, bộ đếm và dữ liệu ngẫu nhiên làm cho khả năng va chạm cực kỳ khó xảy ra, ngay cả trong các hệ thống phân tán.
  2. Tính mở rộng theo chiều ngang: CUID có thể được tạo ra độc lập trên nhiều máy mà không cần phối hợp.
  3. Sắp xếp tuần tự: Thành phần dấu thời gian cho phép sắp xếp CUID theo thứ tự thời gian.
  4. Thân thiện với URL: CUID thường được cấu thành từ các ký tự an toàn cho URL.

Các trường hợp sử dụng phổ biến cho CUID bao gồm:

  • Khóa chính của cơ sở dữ liệu
  • Các hệ thống phân tán nơi cần tạo ra ID duy nhất trên nhiều nút
  • ID phiên trong các ứng dụng web
  • Theo dõi sự kiện trong các hệ thống phân tích
  • Đặt tên cho tệp hoặc tài nguyên trong các hệ thống lưu trữ đám mây

Ví dụ mã

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

// JavaScript (sử dụng thư viện 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (sử dụng thư viện 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (sử dụng gem 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (sử dụng thư viện 'com.github.f4b6a3.cuid')
import com.github.f4b6a3.cuid.Cuid;

public class CuidExample {
    public static void main(String[] args) {
        String id = Cuid.createCuid();
        System.out.println(id);
    }
}
// C# (sử dụng gói NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (sử dụng gói 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (sử dụng gói 'github.com/lucsky/cuid')
package main

import (
    "fmt"
    "github.com/lucsky/cuid"
)

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (sử dụng gói 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (sử dụng một triển khai tùy chỉnh)
#include <iostream>
#include <chrono>
#include <random>
#include <sstream>
#include <iomanip>

std::string generateCUID() {
    auto now = std::chrono::system_clock::now();
    auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    auto value = now_ms.time_since_epoch();
    long duration = value.count();

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 35);

    std::stringstream ss;
    ss << 'c';
    ss << std::hex << std::setfill('0') << std::setw(8) << duration;
    for (int i = 0; i < 8; i++) {
        int r = dis(gen);
        ss << (char)(r < 10 ? '0' + r : 'a' + r - 10);
    }
    return ss.str();
}

int main() {
    std::string id = generateCUID();
    std::cout << id << std::endl;
    return 0;
}
% MATLAB (sử dụng một triển khai tùy chỉnh)
function id = generateCUID()
    timestamp = dec2hex(round(posixtime(datetime('now'))*1000), 8);
    random = '';
    for i = 1:8
        random = [random char(randi([48 57 97 122]))];
    end
    id = ['c' timestamp random];
end

% Sử dụng
id = generateCUID();
disp(id);
## R (sử dụng một triển khai tùy chỉnh)
library(lubridate)

generate_cuid <- function() {
  timestamp <- format(as.numeric(now()) * 1000, scientific = FALSE)
  timestamp <- substr(timestamp, 1, 8)
  random <- paste0(sample(c(0:9, letters[1:6]), 8, replace = TRUE), collapse = "")
  paste0("c", timestamp, random)
}

## Sử dụng
id <- generate_cuid()
print(id)
' Excel VBA (sử dụng một triển khai tùy chỉnh)
Function GenerateCUID() As String
    Dim timestamp As String
    Dim random As String
    Dim i As Integer
    
    timestamp = Right("00000000" & Hex(CLng(CDbl(Now()) * 86400000)), 8)
    
    For i = 1 To 8
        random = random & Mid("0123456789abcdef", Int(Rnd() * 16) + 1, 1)
    Next i
    
    GenerateCUID = "c" & timestamp & random
End Function

' Sử dụng trong một ô
'=GenerateCUID()

Lịch sử và Phát triển

CUID được phát triển lần đầu bởi Eric Elliott vào năm 2012 như một giải pháp cho vấn đề tạo ra các định danh duy nhất trong các hệ thống phân tán. Khái niệm này được lấy cảm hứng từ hệ thống ID Snowflake của Twitter nhưng được thiết kế để dễ dàng triển khai và sử dụng trên nhiều nền tảng khác nhau.

Sự phát triển của CUID được thúc đẩy bởi nhu cầu về một hệ thống ID đơn giản, chống va chạm có thể hoạt động trên các ngôn ngữ lập trình và môi trường khác nhau. Mục tiêu của Elliott là tạo ra một hệ thống dễ triển khai, không cần phối hợp trung tâm và có thể mở rộng theo chiều ngang.

Kể từ khi ra đời, CUID đã trải qua nhiều lần cải tiến và phát triển:

  1. Triển khai CUID ban đầu tập trung vào sự đơn giản và dễ sử dụng.
  2. Khi việc áp dụng gia tăng, cộng đồng đã đóng góp các triển khai bằng nhiều ngôn ngữ lập trình khác nhau.
  3. Năm 2021, CUID2 được giới thiệu để giải quyết một số hạn chế của CUID ban đầu và cung cấp hiệu suất tốt hơn và khả năng chống va chạm cao hơn.
  4. CUID2 đã cải tiến CUID ban đầu bằng cách sử dụng một bộ sinh số ngẫu nhiên an toàn hơn và tăng độ dài tổng thể của định danh.

Sự phát triển của CUID phản ánh nhu cầu thay đổi của các hệ thống phân tán và những nỗ lực liên tục để cân bằng giữa sự đơn giản, an toàn và hiệu suất trong việc tạo ra các định danh duy nhất.

Tài liệu tham khảo

  1. Kho lưu trữ GitHub chính thức của CUID
  2. Thông số kỹ thuật CUID2
  3. Elliott, Eric. "Tạo ID duy nhất trong môi trường phân tán." Medium, 2015.
  4. "ID chống va chạm cho các hệ thống phân tán." DZone, 2018.

Công cụ tạo CUID này cho phép bạn nhanh chóng tạo ra CUID cho các dự án của mình. Chỉ cần nhấp vào nút "Tạo" để tạo một CUID mới, và sử dụng nút "Sao chép" để sao chép nó vào clipboard của bạn để dễ dàng sử dụng trong các ứng dụng của bạn.

Feedback