Whiz Tools

ตัวสร้าง CUID

สร้าง ID ที่ทนต่อการชนกันได้อย่างรวดเร็วและง่ายดาย

โครงสร้าง CUID

เวลาประทับ:

สุ่ม:

CUID Generator

บทนำ

CUID (Collision-resistant Unique IDentifier) เป็นตัวระบุที่ไม่ซ้ำกันซึ่งออกแบบมาให้ทนต่อการชนกัน, ขยายตัวในแนวนอน, และสามารถเรียงลำดับตามลำดับเวลาได้ CUIDs มีประโยชน์โดยเฉพาะในระบบที่กระจายซึ่งจำเป็นต้องสร้างตัวระบุที่ไม่ซ้ำกันโดยไม่ต้องประสานงานระหว่างโหนด

โครงสร้างของ CUIDs

CUID โดยทั่วไปประกอบด้วยส่วนประกอบต่อไปนี้:

  1. Timestamp: การแทนค่าของเวลาปัจจุบัน
  2. Counter: ตัวนับที่เรียงลำดับเพื่อให้แน่ใจว่ามีความไม่ซ้ำกันภายในมิลลิวินาทีเดียวกัน
  3. Client fingerprint: ตัวระบุที่ไม่ซ้ำกันสำหรับเครื่องหรือกระบวนการที่สร้าง CUID
  4. Random component: ข้อมูลสุ่มเพิ่มเติมเพื่อลดความน่าจะเป็นของการชนกัน

โครงสร้างที่แน่นอนอาจแตกต่างกันไปขึ้นอยู่กับการใช้งาน CUID แต่ส่วนประกอบเหล่านี้ทำงานร่วมกันเพื่อสร้างตัวระบุที่ไม่ซ้ำกันและสามารถเรียงลำดับได้

นี่คือการแสดงภาพของโครงสร้าง CUID ที่เป็นที่นิยม:

Timestamp Counter Fingerprint Random

วิธีการสร้าง CUIDs

CUIDs ถูกสร้างขึ้นโดยใช้การรวมกันของส่วนประกอบที่อิงตามเวลาและสุ่ม กระบวนการปกติประกอบด้วย:

  1. รับค่าของ timestamp ปัจจุบัน
  2. เพิ่มค่าตัวนับ (ซึ่งจะรีเซ็ตเป็นระยะ ๆ)
  3. สร้าง client fingerprint (มักทำเพียงครั้งเดียวต่อเซสชันหรือการเริ่มต้นแอปพลิเคชัน)
  4. เพิ่มข้อมูลสุ่ม
  5. รวมส่วนประกอบเหล่านี้ในรูปแบบที่เฉพาะเจาะจง

CUID ที่ได้มักจะแสดงเป็นสตริงของตัวอักษรและตัวเลข

ข้อดีและกรณีการใช้งาน

CUIDs มีข้อดีหลายประการเมื่อเปรียบเทียบกับระบบตัวระบุที่ไม่ซ้ำกันอื่น ๆ:

  1. การทนต่อการชนกัน: การรวมกันของ timestamp, counter, และข้อมูลสุ่มทำให้การชนกันมีความน่าจะเป็นต่ำมาก แม้ในระบบที่กระจาย
  2. การขยายตัวในแนวนอน: CUIDs สามารถสร้างได้อย่างอิสระบนหลายเครื่องโดยไม่ต้องประสานงาน
  3. การเรียงลำดับตามลำดับเวลา: ส่วนประกอบ timestamp ช่วยให้สามารถเรียงลำดับ CUIDs ตามเวลา
  4. เป็นมิตรกับ URL: CUIDs มักประกอบด้วยตัวอักษรที่ปลอดภัยสำหรับ URL

กรณีการใช้งานทั่วไปสำหรับ CUIDs ได้แก่:

  • คีย์หลักในฐานข้อมูล
  • ระบบที่กระจายซึ่งจำเป็นต้องสร้าง ID ที่ไม่ซ้ำกันข้ามโหนดหลายตัว
  • ID เซสชันในแอปพลิเคชันเว็บ
  • การติดตามเหตุการณ์ในระบบวิเคราะห์ข้อมูล
  • การตั้งชื่อไฟล์หรือทรัพยากรในระบบจัดเก็บข้อมูลคลาวด์

ตัวอย่างโค้ด

นี่คือตัวอย่างการสร้าง CUID ในหลายภาษาโปรแกรม:

// JavaScript (ใช้ไลบรารี 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (ใช้ไลบรารี 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (ใช้ 'cuid' gem)
require 'cuid'
id = Cuid::generate
puts id
// Java (ใช้ไลบรารี '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# (ใช้แพ็คเกจ 'Cuid.Net' NuGet)
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (ใช้แพ็คเกจ 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (ใช้แพ็คเกจ 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (ใช้แพ็คเกจ 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (ใช้การใช้งานที่กำหนดเอง)
#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 (ใช้การใช้งานที่กำหนดเอง)
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

% การใช้งาน
id = generateCUID();
disp(id);
## R (ใช้การใช้งานที่กำหนดเอง)
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)
}

## การใช้งาน
id <- generate_cuid()
print(id)
' Excel VBA (ใช้การใช้งานที่กำหนดเอง)
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

' การใช้งานในเซลล์
'=GenerateCUID()

ประวัติและการพัฒนา

CUIDs ถูกพัฒนาขึ้นโดย Eric Elliott ในปี 2012 เป็นวิธีแก้ปัญหาในการสร้างตัวระบุที่ไม่ซ้ำกันในระบบที่กระจาย แนวคิดนี้ได้รับแรงบันดาลใจจากระบบ ID ของ Twitter ที่ชื่อว่า Snowflake แต่ถูกออกแบบมาให้ใช้งานได้ง่ายขึ้นและสามารถใช้ได้ในหลายแพลตฟอร์ม

การพัฒนาของ CUIDs ถูกขับเคลื่อนโดยความต้องการระบบ ID ที่ไม่ซ้ำกันที่เรียบง่ายและทนต่อการชนกัน ซึ่งสามารถทำงานได้ในหลายภาษาโปรแกรมและสภาพแวดล้อม เป้าหมายของ Elliott คือการสร้างระบบที่ง่ายต่อการใช้งาน ไม่ต้องการการประสานงานกลาง และสามารถขยายตัวในแนวนอนได้

ตั้งแต่เริ่มต้น CUID ได้ผ่านการปรับปรุงและพัฒนาหลายครั้ง:

  1. การใช้งาน CUID ดั้งเดิมมุ่งเน้นที่ความเรียบง่ายและการใช้งานที่ง่าย
  2. เมื่อการใช้งานเพิ่มขึ้น ชุมชนได้มีส่วนร่วมในการพัฒนาการใช้งานในหลายภาษาโปรแกรม
  3. ในปี 2021 CUID2 ได้ถูกนำเสนอเพื่อตอบสนองข้อจำกัดบางประการของ CUID ดั้งเดิมและให้ประสิทธิภาพและความทนทานต่อการชนกันที่ดียิ่งขึ้น
  4. CUID2 ได้ปรับปรุง CUID ดั้งเดิมโดยใช้ตัวสร้างเลขสุ่มที่ปลอดภัยมากขึ้นและเพิ่มความยาวโดยรวมของตัวระบุ

การพัฒนาของ CUIDs สะท้อนถึงความต้องการที่เปลี่ยนแปลงของระบบที่กระจายและความพยายามอย่างต่อเนื่องในการสร้างสมดุลระหว่างความเรียบง่าย ความปลอดภัย และประสิทธิภาพในการสร้างตัวระบุที่ไม่ซ้ำกัน

อ้างอิง

  1. ที่เก็บ GitHub อย่างเป็นทางการของ CUID
  2. ข้อกำหนด CUID2
  3. Elliott, Eric. "การสร้าง ID ที่ไม่ซ้ำกันในสภาพแวดล้อมที่กระจาย." Medium, 2015.
  4. "ID ที่ทนต่อการชนกันสำหรับระบบที่กระจาย." DZone, 2018.

เครื่องมือสร้าง CUID นี้ช่วยให้คุณสามารถสร้าง CUIDs ได้อย่างรวดเร็วสำหรับโครงการของคุณ เพียงคลิกที่ปุ่ม "สร้าง" เพื่อสร้าง CUID ใหม่ และใช้ปุ่ม "คัดลอก" เพื่อคัดลอกไปยังคลิปบอร์ดของคุณเพื่อใช้งานในแอปพลิเคชันของคุณได้อย่างง่ายดาย

Feedback