Whiz Tools

CUID-generaattori

Luo törmäyksiltä suojattu tunnus nopeasti ja helposti.

CUID-rakenne

Aikaleima:

Satunnainen:

CUID-generaattori

Johdanto

CUID (Collision-resistant Unique IDentifier) on ainutlaatuinen tunniste, joka on suunniteltu olemaan törmäyksiltä suojattu, vaakasuunnassa skaalautuva ja järjestettävissä aikajärjestykseen. CUIDit ovat erityisen hyödyllisiä hajautetuissa järjestelmissä, joissa ainutlaatuisia tunnisteita on tuotettava ilman solmujen välistä koordinointia.

CUIDien rakenne

CUID koostuu tyypillisesti seuraavista komponenteista:

  1. Aikaleima: Nykyisen ajan esitys
  2. Laskuri: Jatkuva laskuri, joka varmistaa ainutlaatuisuuden saman millisekunnin sisällä
  3. Asiakasjälki: Ainutlaatuinen tunniste koneelle tai prosessille, joka tuottaa CUIDin
  4. Satunnainen komponentti: Lisäsatunnaista dataa, joka vähentää törmäysmahdollisuuksia

Tarkka rakenne voi vaihdella CUID-toteutuksen mukaan, mutta nämä komponentit toimivat yhdessä luodakseen ainutlaatuisen ja järjestettävän tunnisteen.

Tässä on visuaalinen esitys tyypillisestä CUID-rakenteesta:

Aikaleima Laskuri Jälki Satunnainen

Kuinka CUIDit luodaan

CUIDit luodaan käyttämällä aikaperusteisia ja satunnaisia komponentteja. Prosessi sisältää tyypillisesti:

  1. Nykyisen aikaleiman saamisen
  2. Laskurin lisäämisen (joka nollataan säännöllisesti)
  3. Asiakasjäljen tuottamisen (yleensä kerran istunnon tai sovelluksen aloituksen yhteydessä)
  4. Satunnaisen datan lisäämisen
  5. Näiden elementtien yhdistämisen tietyssä muodossa

Tuloksena oleva CUID esitetään tyypillisesti merkkijonona, joka koostuu kirjaimista ja numeroista.

Edut ja käyttötapaukset

CUIDit tarjoavat useita etuja muihin ainutlaatuisen tunnistamisen järjestelmiin verrattuna:

  1. Törmäyksiltä suojattu: Aikaleiman, laskurin ja satunnaisen datan yhdistelmä tekee törmäyksistä erittäin epätodennäköisiä, jopa hajautetuissa järjestelmissä.
  2. Vaakasuuntainen skaalautuvuus: CUIDit voidaan luoda itsenäisesti useilla koneilla ilman koordinointia.
  3. Aikajärjestykseen järjestäminen: Aikaleimakomponentti mahdollistaa CUIDien aikajärjestyksessä järjestämisen.
  4. URL-ystävällinen: CUIDit koostuvat tyypillisesti URL-turvallisista merkeistä.

Yleisiä käyttötapauksia CUIDeille ovat:

  • Tietokannan ensisijaiset avaimet
  • Hajautetut järjestelmät, joissa ainutlaatuisia ID:itä on tuotettava useilla solmuilla
  • Istuntotunnukset verkkosovelluksissa
  • Tapahtumien seuranta analytiikkajärjestelmissä
  • Tiedostojen tai resurssien nimeäminen pilvitallennusjärjestelmissä

Koodiesimerkit

Tässä on esimerkkejä CUIDien tuottamisesta eri ohjelmointikielillä:

// JavaScript (käyttäen 'cuid'-kirjastoa)
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (käyttäen 'cuid'-kirjastoa)
import cuid
id = cuid.cuid()
print(id)
## Ruby (käyttäen 'cuid'-gemmiä)
require 'cuid'
id = Cuid::generate
puts id
// Java (käyttäen 'com.github.f4b6a3.cuid'-kirjastoa)
import com.github.f4b6a3.cuid.Cuid;

public class CuidExample {
    public static void main(String[] args) {
        String id = Cuid.createCuid();
        System.out.println(id);
    }
}
// C# (käyttäen 'Cuid.Net'-NuGet-pakettia)
using Cuid;

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

$id = Cuid::make();
echo $id;
// Go (käyttäen 'github.com/lucsky/cuid'-pakettia)
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (käyttäen 'CUID'-pakettia)
import CUID

let id = CUID()
print(id)
// C++ (käyttäen mukautettua toteutusta)
#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 (käyttäen mukautettua toteutusta)
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

% Käyttö
id = generateCUID();
disp(id);
## R (käyttäen mukautettua toteutusta)
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)
}

## Käyttö
id <- generate_cuid()
print(id)
' Excel VBA (käyttäen mukautettua toteutusta)
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

' Käyttö solussa
'=GenerateCUID()

Historia ja kehitys

CUIDit kehitti alun perin Eric Elliott vuonna 2012 ratkaisuksi ainutlaatuisten tunnisteiden tuottamiseen hajautetuissa järjestelmissä. Konsepti sai inspiraationsa Twitterin Snowflake-ID-järjestelmästä, mutta se suunniteltiin helpommin toteutettavaksi ja käytettäväksi eri alustoilla.

CUIDien kehitys johtui tarpeesta yksinkertaiseen, törmäyksiltä suojattuun ID-järjestelmään, joka voisi toimia eri ohjelmointikielissä ja ympäristöissä. Elliottin tavoite oli luoda järjestelmä, jota oli helppo toteuttaa, joka ei vaatinut keskitettyä koordinointia ja joka voisi skaalautua vaakasuunnassa.

Sen jälkeen, kun CUIDit oli kehitetty, ne ovat käyneet läpi useita iteraatioita ja parannuksia:

  1. Alkuperäinen CUID-toteutus keskittyi yksinkertaisuuteen ja käytettävyyteen.
  2. Käytön kasvaessa yhteisö on tuottanut toteutuksia eri ohjelmointikielillä.
  3. Vuonna 2021 esiteltiin CUID2, joka käsitteli alkuperäisen CUIDin rajoituksia ja tarjosi vielä paremman suorituskyvyn ja törmäyksiltä suojan.
  4. CUID2 paransi alkuperäistä käyttämällä turvallisempaa satunnaislukugeneraattoria ja lisäämällä tunnisteen kokonaispituutta.

CUIDien kehitys heijastaa hajautettujen järjestelmien muuttuvia tarpeita ja jatkuvia pyrkimyksiä tasapainottaa yksinkertaisuus, turvallisuus ja suorituskyky ainutlaatuisten tunnisteiden tuottamisessa.

Viitteet

  1. Virallinen CUID GitHub-repositorio
  2. CUID2-määrittely
  3. Elliott, Eric. "Ainutlaatuisten ID:iden generointi hajautetussa ympäristössä." Medium, 2015.
  4. "Törmäyksiltä suojatut ID:t hajautetuissa järjestelmissä." DZone, 2018.

Tämä CUID-generaattorityökalu mahdollistaa CUIDien nopean tuottamisen projekteihisi. Napsauta vain "Generoi"-painiketta luodaksesi uuden CUIDin, ja käytä "Kopioi"-painiketta kopioidaksesi sen leikepöydälle helppoa käyttöä varten sovelluksissasi.

Feedback