Whiz Tools

Penjana CUID

Hasilkan ID yang tahan perlanggaran dengan cepat dan mudah.

Struktur CUID

Cap Waktu:

Rawak:

Penjana CUID

Pengenalan

CUID (Collision-resistant Unique IDentifier) adalah pengenal unik yang direka untuk tahan terhadap perlanggaran, boleh skala secara mendatar, dan boleh disusun secara berurutan. CUID sangat berguna dalam sistem teragih di mana pengenal unik perlu dijana tanpa koordinasi antara nod.

Struktur CUID

CUID biasanya terdiri daripada komponen berikut:

  1. Cap waktu: Representasi waktu semasa
  2. Penghitung: Penghitung berurutan untuk memastikan keunikan dalam milisaat yang sama
  3. Jejak klien: Pengenal unik bagi mesin atau proses yang menjana CUID
  4. Komponen rawak: Data rawak tambahan untuk mengurangkan kemungkinan perlanggaran

Struktur tepat mungkin berbeza bergantung pada pelaksanaan CUID, tetapi komponen ini bekerjasama untuk mencipta pengenal yang unik dan boleh disusun.

Berikut adalah representasi visual struktur CUID yang tipikal:

Cap Waktu Penghitung Jejak Rawak

Cara CUID Dijana

CUID dijana menggunakan gabungan komponen berasaskan waktu dan rawak. Proses biasanya melibatkan:

  1. Mendapatkan cap waktu semasa
  2. Meningkatkan penghitung (yang akan menetap secara berkala)
  3. Menghasilkan jejak klien (biasanya dilakukan sekali setiap sesi atau permulaan aplikasi)
  4. Menambah data rawak
  5. Menggabungkan elemen-elemen ini dalam format tertentu

CUID yang dihasilkan biasanya diwakili sebagai rentetan huruf dan nombor.

Kelebihan dan Kes Penggunaan

CUID menawarkan beberapa kelebihan berbanding sistem pengenal unik lain:

  1. Tahan terhadap perlanggaran: Gabungan cap waktu, penghitung, dan data rawak menjadikan perlanggaran sangat tidak mungkin, bahkan dalam sistem teragih.
  2. Kebolehan skala secara mendatar: CUID boleh dijana secara bebas di banyak mesin tanpa koordinasi.
  3. Penyusunan berurutan: Komponen cap waktu membolehkan penyusunan kronologi CUID.
  4. Mesra URL: CUID biasanya terdiri daripada watak yang selamat untuk URL.

Kes penggunaan biasa untuk CUID termasuk:

  • Kunci utama pangkalan data
  • Sistem teragih di mana ID unik perlu dijana merentasi pelbagai nod
  • ID sesi dalam aplikasi web
  • Menjejak acara dalam sistem analitik
  • Penamaan fail atau sumber dalam sistem penyimpanan awan

Contoh Kod

Berikut adalah contoh menjana CUID dalam pelbagai bahasa pengaturcaraan:

// JavaScript (menggunakan pustaka 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (menggunakan pustaka 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (menggunakan gem 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (menggunakan pustaka '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# (menggunakan pakej NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (menggunakan pakej 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (menggunakan pakej 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (menggunakan pakej 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (menggunakan pelaksanaan khusus)
#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 (menggunakan pelaksanaan khusus)
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

% Penggunaan
id = generateCUID();
disp(id);
## R (menggunakan pelaksanaan khusus)
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)
}

## Penggunaan
id <- generate_cuid()
print(id)
' Excel VBA (menggunakan pelaksanaan khusus)
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

' Penggunaan dalam sel
'=GenerateCUID()

Sejarah dan Pembangunan

CUID pada asalnya dibangunkan oleh Eric Elliott pada tahun 2012 sebagai penyelesaian kepada masalah menjana pengenal unik dalam sistem teragih. Konsep ini diilhamkan oleh sistem ID Snowflake Twitter tetapi direka untuk lebih mudah dilaksanakan dan digunakan merentasi pelbagai platform.

Pembangunan CUID didorong oleh keperluan untuk sistem ID yang mudah, tahan terhadap perlanggaran yang boleh berfungsi merentasi pelbagai bahasa pengaturcaraan dan persekitaran. Matlamat Elliott adalah untuk mencipta sistem yang mudah dilaksanakan, tidak memerlukan koordinasi pusat, dan boleh skala secara mendatar.

Sejak penubuhannya, CUID telah melalui beberapa iterasi dan penambahbaikan:

  1. Pelaksanaan CUID asal memberi tumpuan kepada kesederhanaan dan kemudahan penggunaan.
  2. Apabila penggunaan meningkat, komuniti menyumbang pelaksanaan dalam pelbagai bahasa pengaturcaraan.
  3. Pada tahun 2021, CUID2 diperkenalkan untuk menangani beberapa had CUID asal dan memberikan prestasi dan ketahanan perlanggaran yang lebih baik.
  4. CUID2 memperbaiki CUID asal dengan menggunakan penjana nombor rawak yang lebih selamat dan meningkatkan panjang keseluruhan pengenal.

Evolusi CUID mencerminkan keperluan yang berubah dalam sistem teragih dan usaha berterusan untuk menyeimbangkan kesederhanaan, keselamatan, dan prestasi dalam penjanaan pengenal unik.

Rujukan

  1. Repositori GitHub CUID Rasmi
  2. Spesifikasi CUID2
  3. Elliott, Eric. "Menghasilkan ID Unik dalam Persekitaran Teragih." Medium, 2015.
  4. "ID yang tahan terhadap perlanggaran untuk Sistem Teragih." DZone, 2018.

Alat penjana CUID ini membolehkan anda dengan cepat menjana CUID untuk projek anda. Hanya klik butang "Jana" untuk mencipta CUID baru, dan gunakan butang "Salin" untuk menyalinnya ke papan klip anda untuk penggunaan yang mudah dalam aplikasi anda.

Feedback