Whiz Tools

مولد CUID

قم بإنشاء معرف مقاوم للتصادم بسرعة وسهولة.

هيكل CUID

الطابع الزمني:

عشوائي:

مولد CUID

مقدمة

CUID (معرف فريد مقاوم للتصادم) هو معرف فريد مصمم ليكون مقاومًا للتصادم، وقابلًا للتوسع أفقيًا، وقابلًا للفرز بترتيب زمني. تعتبر CUIDs مفيدة بشكل خاص في الأنظمة الموزعة حيث تحتاج المعرفات الفريدة إلى أن تُولد بدون تنسيق بين العقد.

هيكل CUIDs

يتكون CUID عادةً من المكونات التالية:

  1. الطابع الزمني: تمثيل للوقت الحالي
  2. العداد: عداد متسلسل لضمان الفريدة ضمن نفس المللي ثانية
  3. بصمة العميل: معرف فريد للجهاز أو العملية التي تولد CUID
  4. المكون العشوائي: بيانات عشوائية إضافية لتقليل احتمال التصادم

قد يختلف الهيكل الدقيق حسب تنفيذ CUID، لكن هذه المكونات تعمل معًا لإنشاء معرف فريد وقابل للفرز.

إليك تمثيل بصري لهيكل CUID النموذجي:

الطابع الزمني العداد البصمة عشوائي

كيفية توليد CUIDs

تُولد CUIDs باستخدام مزيج من المكونات المعتمدة على الوقت والعشوائية. تتضمن العملية عادةً:

  1. الحصول على الطابع الزمني الحالي
  2. زيادة العداد (الذي يعاد ضبطه دوريًا)
  3. توليد بصمة العميل (عادةً ما يتم ذلك مرة واحدة لكل جلسة أو بدء تطبيق)
  4. إضافة بيانات عشوائية
  5. دمج هذه العناصر في تنسيق محدد

عادةً ما يتم تمثيل CUID الناتج كسلسلة من الحروف والأرقام.

المزايا وحالات الاستخدام

تقدم CUIDs العديد من المزايا مقارنةً بأنظمة المعرفات الفريدة الأخرى:

  1. مقاومة التصادم: تجعل مجموعة الطابع الزمني والعداد والبيانات العشوائية التصادمات غير مرجحة للغاية، حتى في الأنظمة الموزعة.
  2. التوسع الأفقي: يمكن توليد CUIDs بشكل مستقل على عدة آلات بدون تنسيق.
  3. الفرز الزمني: يسمح مكون الطابع الزمني بفرز CUIDs ترتيبًا زمنيًا.
  4. صديقة لعنوان URL: تتكون CUIDs عادةً من أحرف آمنة لعنوان URL.

تشمل حالات الاستخدام الشائعة لـ CUIDs:

  • مفاتيح أساسية في قواعد البيانات
  • الأنظمة الموزعة حيث تحتاج المعرفات الفريدة إلى أن تُولد عبر عدة عقد
  • معرفات الجلسة في تطبيقات الويب
  • تتبع الأحداث في أنظمة التحليلات
  • تسمية الملفات أو الموارد في أنظمة التخزين السحابية

أمثلة على الكود

إليك أمثلة على توليد CUIDs في لغات برمجة مختلفة:

// JavaScript (باستخدام مكتبة '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);
    }
}
// C# (باستخدام حزمة 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;
}
% 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 في الأصل بواسطة إريك إليوت في عام 2012 كحل لمشكلة توليد معرفات فريدة في الأنظمة الموزعة. استلهمت الفكرة من نظام معرفات Snowflake الخاص بتويتر ولكن تم تصميمها لتكون أكثر سهولة في التنفيذ والاستخدام عبر منصات مختلفة.

كان تطوير CUIDs مدفوعًا بالحاجة إلى نظام معرف بسيط مقاوم للتصادم يمكن أن يعمل عبر لغات برمجة وبيئات مختلفة. كانت هدف إليوت هو إنشاء نظام سهل التنفيذ، لا يتطلب تنسيق مركزي، ويمكن أن يتوسع أفقيًا.

منذ نشأتها، مرت CUID بعدة مراحل وتحسينات:

  1. ركز تنفيذ CUID الأصلي على البساطة وسهولة الاستخدام.
  2. مع زيادة الاعتماد، ساهمت المجتمع بتنفيذات في لغات برمجة مختلفة.
  3. في عام 2021، تم تقديم CUID2 لمعالجة بعض قيود CUID الأصلية وتوفير أداء أفضل ومقاومة للتصادم.
  4. حسنت CUID2 النسخة الأصلية من خلال استخدام مولد أرقام عشوائية أكثر أمانًا وزيادة الطول الإجمالي للمعرف.

تعكس تطورات CUIDs الاحتياجات المتغيرة للأنظمة الموزعة والجهود المستمرة لتحقيق التوازن بين البساطة والأمان والأداء في توليد المعرفات الفريدة.

المراجع

  1. المستودع الرسمي لـ CUID على GitHub
  2. مواصفات CUID2
  3. إليوت، إريك. "توليد معرفات فريدة في بيئة موزعة." Medium، 2015.
  4. "معرفات مقاومة للتصادم للأنظمة الموزعة." DZone، 2018.

تسمح لك أداة مولد CUID هذه بتوليد CUIDs بسرعة لمشاريعك. ببساطة انقر على زر "توليد" لإنشاء CUID جديد، واستخدم زر "نسخ" لنسخه إلى الحافظة الخاصة بك للاستخدام السهل في تطبيقاتك.

Feedback