Whiz Tools

ژنراتور CUID

به سرعت و به آسانی یک شناسه مقاوم در برابر برخورد تولید کنید.

ساختار CUID

زمان‌سنج:

تصادفی:

تولید کننده CUID

مقدمه

CUID (شناسه منحصر به فرد مقاوم در برابر تصادم) یک شناسه منحصر به فرد است که برای مقاوم بودن در برابر تصادم، مقیاس‌پذیری افقی و قابلیت مرتب‌سازی ترتیبی طراحی شده است. CUIDها به‌ویژه در سیستم‌های توزیع‌شده که نیاز به تولید شناسه‌های منحصر به فرد بدون هماهنگی بین گره‌ها دارند، مفید هستند.

ساختار CUIDها

یک CUID معمولاً از اجزای زیر تشکیل شده است:

  1. زمان: نمایشی از زمان جاری
  2. شمارنده: یک شمارنده ترتیبی برای اطمینان از منحصر به فرد بودن در همان میلی‌ثانیه
  3. اثر انگشت کلاینت: یک شناسه منحصر به فرد برای ماشین یا فرآیند تولیدکننده CUID
  4. جزء تصادفی: داده‌های تصادفی اضافی برای کاهش بیشتر احتمال تصادم

ساختار دقیق ممکن است بسته به پیاده‌سازی CUID متفاوت باشد، اما این اجزا به‌طور مشترک برای ایجاد یک شناسه منحصر به فرد و قابل مرتب‌سازی کار می‌کنند.

در اینجا یک نمای بصری از ساختار معمولی CUID آورده شده است:

زمان شمارنده اثر انگشت تصادفی

نحوه تولید CUIDها

CUIDها با استفاده از ترکیبی از اجزای مبتنی بر زمان و تصادفی تولید می‌شوند. این فرآیند معمولاً شامل مراحل زیر است:

  1. دریافت زمان جاری
  2. افزایش شمارنده (که به‌طور دوره‌ای بازنشانی می‌شود)
  3. تولید اثر انگشت کلاینت (معمولاً یک بار در هر جلسه یا شروع برنامه انجام می‌شود)
  4. افزودن داده‌های تصادفی
  5. ترکیب این عناصر در یک فرمت خاص

CUID حاصل معمولاً به‌صورت یک رشته از حروف و اعداد نمایش داده می‌شود.

مزایا و موارد استفاده

CUIDها مزایای متعددی نسبت به سایر سیستم‌های شناسه منحصر به فرد ارائه می‌دهند:

  1. مقاومت در برابر تصادم: ترکیب زمان، شمارنده و داده‌های تصادفی احتمال تصادم را حتی در سیستم‌های توزیع‌شده به شدت کاهش می‌دهد.
  2. مقیاس‌پذیری افقی: CUIDها می‌توانند به‌طور مستقل در چندین ماشین بدون هماهنگی تولید شوند.
  3. مرتب‌سازی ترتیبی: جزء زمان امکان مرتب‌سازی زمانی CUIDها را فراهم می‌کند.
  4. مناسب برای URL: CUIDها معمولاً از کاراکترهای امن برای URL تشکیل شده‌اند.

موارد استفاده رایج برای CUIDها شامل:

  • کلیدهای اصلی پایگاه داده
  • سیستم‌های توزیع‌شده که نیاز به تولید شناسه‌های منحصر به فرد در چندین گره دارند
  • شناسه‌های جلسه در برنامه‌های وب
  • ردیابی رویدادها در سیستم‌های تحلیلی
  • نام‌گذاری فایل یا منبع در سیستم‌های ذخیره‌سازی ابری

مثال‌های کد

در اینجا مثال‌هایی از تولید CUIDها در زبان‌های برنامه‌نویسی مختلف آورده شده است:

// جاوا اسکریپت (با استفاده از کتابخانه 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## پایتون (با استفاده از کتابخانه 'cuid')
import cuid
id = cuid.cuid()
print(id)
## روبی (با استفاده از جواهر 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// جاوا (با استفاده از کتابخانه '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);
    }
}
// سی‌شارپ (با استفاده از بسته NuGet 'Cuid.Net')
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)
}
// سوئیفت (با استفاده از بسته '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;
}
% متلب (با استفاده از یک پیاده‌سازی سفارشی)
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)
' 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()

تاریخچه و توسعه

CUIDها به‌طور اولیه توسط اریک الیوت در سال 2012 به‌عنوان راه‌حلی برای مشکل تولید شناسه‌های منحصر به فرد در سیستم‌های توزیع‌شده توسعه یافتند. این مفهوم از سیستم شناسه Snowflake توئیتر الهام گرفته شده است، اما طراحی شده است تا به‌راحتی در پلتفرم‌های مختلف پیاده‌سازی و استفاده شود.

توسعه CUIDها با نیاز به یک سیستم شناسه منحصر به فرد ساده، مقاوم در برابر تصادم که بتواند در زبان‌ها و محیط‌های مختلف کار کند، هدایت شد. هدف الیوت ایجاد سیستمی بود که پیاده‌سازی آن آسان باشد، نیاز به هماهنگی مرکزی نداشته باشد و بتواند به‌صورت افقی مقیاس‌پذیر باشد.

از زمان پیدایش، CUIDها چندین بار دستخوش تغییرات و بهبودها شده‌اند:

  1. پیاده‌سازی اولیه CUID بر سادگی و سهولت استفاده تمرکز داشت.
  2. با افزایش پذیرش، جامعه به پیاده‌سازی‌های مختلف در زبان‌های برنامه‌نویسی مختلف کمک کرد.
  3. در سال 2021، CUID2 معرفی شد تا برخی از محدودیت‌های CUID اولیه را برطرف کند و عملکرد و مقاومت در برابر تصادم بهتری ارائه دهد.
  4. CUID2 با استفاده از یک تولیدکننده عدد تصادفی امن‌تر و افزایش طول کلی شناسه بهبود یافته است.

تکامل CUIDها منعکس‌کننده نیازهای متغیر سیستم‌های توزیع‌شده و تلاش‌های مداوم برای تعادل بین سادگی، امنیت و عملکرد در تولید شناسه‌های منحصر به فرد است.

مراجع

  1. مخزن رسمی GitHub CUID
  2. مشخصات CUID2
  3. الیوت، اریک. "تولید شناسه‌های منحصر به فرد در یک محیط توزیع‌شده." مدیوم، 2015.
  4. "شناسه‌های مقاوم در برابر تصادم برای سیستم‌های توزیع‌شده." DZone، 2018.

این ابزار تولید کننده CUID به شما این امکان را می‌دهد که به‌سرعت CUIDها را برای پروژه‌های خود تولید کنید. کافی است روی دکمه "تولید" کلیک کنید تا یک CUID جدید ایجاد کنید و از دکمه "کپی" برای کپی کردن آن به کلیپ‌بورد خود استفاده کنید تا به‌راحتی در برنامه‌های خود استفاده کنید.

Feedback