UUID چیست و چرا مفید است؟ – CloudSavvy IT


تصویری که یک لپ‌تاپ و فایل‌های جعبه سند را در بالای آن نشان می‌دهد
Stokkete / Shutterstock.com

یک شناسه منحصربه‌فرد جهانی (UUID) شکل خاصی از یک شناسه است که می‌توان با خیال راحت برای بیشتر اهداف عملی آن را منحصربه‌فرد در نظر گرفت. دو UUID که به درستی تولید شده اند تقریباً شانس کمی برای یکسان بودن دارند، حتی اگر در دو محیط مختلف توسط طرف های جداگانه ایجاد شده باشند. به همین دلیل است که UUID ها گزارش می شوند در سراسر جهان منحصر بفرد.

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

در واقع UUID چیست؟

یک UUID به سادگی یک مقدار است که می توانید با خیال راحت آن را منحصر به فرد تلقی کنید. خطر برخورد به حدی کم است که می‌توانید به طور کامل آن را نادیده بگیرید. ممکن است UUID هایی را مشاهده کنید که با استفاده از عبارات مختلف نشان داده شده اند (GUID یا شناسه منحصر به فرد جهانی، معنایی ترجیحی مایکروسافت است) اما معنا و اثر یکسان باقی می ماند.

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

RFC شامل پنج الگوریتم مختلف است که هر کدام از مکانیسم های متفاوتی برای تولید یک مقدار استفاده می کنند. در اینجا خلاصه ای از “نسخه های” موجود است:

  • نسخه ۱ – مبتنی بر زمان یک مهر زمانی، دنباله ساعت، و یک مقدار خاص برای دستگاه ساخت (معمولا آدرس MAC آن) را برای تولید یک خروجی منحصر به فرد برای آن میزبان در آن زمان ترکیب می کند.
  • نسخه ۲ – امنیت DCE – این نسخه به عنوان نسخه تکامل یافته نسخه ۱ برای استفاده با محیط محاسباتی توزیع شده (DCE) توسعه یافته است. به طور گسترده استفاده نمی شود.
  • نسخه ۳ – بر اساس نام (MD5) – MD5 “Namspace” و “name” را هش می کند تا یک مقدار منحصر به فرد برای آن نام در فضای نام ایجاد کند. ایجاد یک UUID دیگر با فضای نام و نام یکسان، خروجی یکسانی را تولید می کند، بنابراین این روش نتایج قابل تکرار می دهد.
  • نسخه ۴ – تصادفی – اکثر سیستم های مدرن تمایل دارند UUID v4 را انتخاب کنند زیرا از منبع میزبان اعداد تصادفی یا شبه تصادفی برای صدور مقادیر خود استفاده می کنند. شانس دو بار تولید یک UUID تقریباً اندک است.
  • نسخه ۵ – بر اساس نام (SHA-1) – این شبیه به نسخه ۳ است اما از الگوریتم قوی تر SHA-1 برای هش فضای نام و نام ورودی استفاده می کند.

حتی اگر RFCها به الگوریتم‌ها به عنوان نسخه اشاره می‌کنند، این بدان معنا نیست که همیشه باید از نسخه ۵ استفاده کنید زیرا به نظر می‌رسد آخرین نسخه است. انتخاب بستگی به مورد استفاده شما دارد. در بسیاری از سناریوها، نسخه ۴ به دلیل ماهیت تصادفی آن انتخاب می شود. این باعث می شود آن را کاندیدای مناسب برای سناریوهای ساده “به من شناسه جدید بده” تبدیل کند.

الگوریتم های تولید یک عدد صحیح بدون علامت ۱۲۸ بیتی صادر می کنند. با این حال، UUID ها بیشتر به صورت رشته های هگزا دیده می شوند و همچنین می توانند به عنوان رشته های باینری ۱۶ کاراکتری ذخیره شوند. در اینجا یک مثال از یک رشته UUID آمده است:

۱۶۷۶۳be4-6022-406e-a950-fcd5018633ca

این مقدار با پنج گروه از نویسه های الفبایی که با کاراکترهای خط تیره از هم جدا شده اند نشان داده می شود. خط تیره عنصر اجباری رشته نیست. وجود آنها به جزئیات تاریخی مشخصات UUID برمی گردد. آنها همچنین تشخیص شناسه را برای چشم انسان آسان تر می کنند.

حقایق استفاده از UUID

مورد استفاده اصلی برای UUID ها تولید غیرمتمرکز شناسه های منحصر به فرد است. شما می توانید یک UUID را در هر جایی ایجاد کنید و با خیال راحت آن را منحصر به فرد در نظر بگیرید، خواه از کد پشتیبان، ماشین مشتری یا موتور پایگاه داده شما منبع آن باشد.

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

در اینجا یک نسخه آزمایشی اولیه PHP وجود دارد که تفاوت را نشان می دهد. بیایید ابتدا به سیستم مبتنی بر اعداد صحیح نگاه کنیم:

class BlogPost {
    public function __construct(
        public readonly ?int $Id,
        public readonly string $Headline,
        public readonly ?AuthorCollection $Authors=null) {}
}
 
#[POST("/posts")]
function createBlogPost(HttpRequest $Request) : void {
    $headline = $Request -> getField("Headline");
    $blogPost = new BlogPost(null, $headline);
}

باید آماده شویم $Id دارایی با null زیرا ما حتی نمی توانیم شناسه واقعی را بدانیم بعد از در پایگاه داده باقی می ماند. این ایده آل نیست – $Id این واقعا نباید پوچ و مجاز باشد BlogPost نمونه هایی از قرار گرفتن در حالت ناقص.

تغییر به UUID این مشکل را برطرف می کند:

class BlogPost {
    public function __construct(
        public readonly string $Uuid,
        public readonly string $Headline,
        public readonly ?AuthorCollection $Authors=null) {}
}
 
#[POST("/posts")]
function createBlogPost(HttpRequest $Request) : void {
    $headline = $Request -> getField("Headline");
    $blogPost = new BlogPost("۱۶۷۶۳be4-...", $headline);
}

شناسه های اشتراک اکنون می توانند در برنامه بدون خطر مقادیر تکراری ایجاد شوند. این تضمین می‌کند که نمونه‌های شی همیشه یک حالت معتبر را نشان می‌دهند و به ویژگی‌های یک شناسه شکستنی نیاز ندارند. این مدل مدیریت منطق معاملاتی را نیز آسان می کند. سوابق کودکانی که نیاز به ارجاع به والدین آنها دارند (مانند انتشارات ما Author Associations) بلافاصله، بدون رفت و برگشت به پایگاه داده برای واکشی شناسه اختصاص داده شده به والد.

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

UUID ها همچنین به شما کمک می کنند تا داده ها را از منابع مختلف ترکیب کنید. ادغام جداول پایگاه داده و حافظه پنهان که از کلیدهای عدد صحیح استفاده می کنند می تواند فرآیندی خسته کننده و مستعد خطا باشد. UUID ها منحصر به فرد بودن را نه تنها در جداول بلکه در سطح کل جهان معرفی می کنند. این باعث می شود که آنها کاندیدای بهتری برای ساختارها و داده های تکراری باشند که اغلب بین سیستم های ذخیره سازی مختلف جابجا می شوند.

وقتی UUID ها با پایگاه های داده ملاقات می کنند هشدار می دهد

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

همین را نمی توان در مورد UUID ها گفت. اول از همه، UUID ها چهار برابر بزرگتر از اعداد صحیح هستند (۳۶ بایت در مقابل ۴ بایت). برای مجموعه داده های بزرگ، این می تواند به خودی خود یک ملاحظات مهم باشد. مرتب سازی و فهرست بندی مقادیر نیز دشوارتر است، به خصوص در مورد UUID های تصادفی رایج تر. طبیعت تصادفی آن به این معنی است که نظم طبیعی ندارد. اگر از UUID به عنوان کلید اصلی استفاده می کنید، این به عملکرد نمایه سازی آسیب می رساند.

این مسائل می توانند در یک پایگاه داده به خوبی تنظیم شوند که از کلیدهای خارجی استفاده گسترده ای می کند. اکنون ممکن است چندین جدول رابطه ای داشته باشید که هر کدام حاوی ارجاعاتی به UUID های ۳۶ بایتی است. در نهایت، حافظه اضافی مورد نیاز برای انجام عملیات اتصال و انواع آنها ممکن است تأثیر قابل توجهی بر عملکرد سیستم شما داشته باشد.

شما می توانید تا حدی با ذخیره UUID ها به عنوان داده های باینری، مشکلات را کاهش دهید. این یعنی الف BINARY(16) ستون به جای VARCHAR(36). برخی از پایگاه های داده مانند PostgreSQL شامل یک فایل هستند UUID نوع داده؛ سایرین مانند MySQL دارای توابعی هستند که می توانند یک رشته UUID را به نمایش باینری آن تبدیل کنند و بالعکس. این رویکرد کارآمدتر است اما به یاد داشته باشید که همچنان از منابع اضافی برای ذخیره و انتخاب داده های خود استفاده خواهید کرد.

یک استراتژی موثر می تواند نگه داشتن اعداد صحیح به عنوان کلیدهای اولیه و افزودن یک فیلد UUID اضافی به عنوان مرجع برای برنامه شما باشد. جداول پیوند رابطه‌ای می‌توانند از شناسه‌ها برای بهبود عملکرد استفاده کنند، در حالی که کد، اشیاء سطح بالا را با استفاده از UUID واکشی و درج می‌کند. همه چیز به سیستم شما، اندازه و اولویت‌های شما برمی‌گردد: زمانی که نیاز به ایجاد یک شناسه غیرمتمرکز و یکپارچه‌سازی مستقیم داده‌ها دارید، UUID بهترین گزینه است، اما شما باید معاوضه‌ها را تشخیص دهید.

خلاصه

UUID ها مقادیر منحصر به فردی هستند که می توانید با خیال راحت از آنها برای ایجاد یک هویت غیرمتمرکز استفاده کنید. برخوردها بودن ممکن است، اما باید آنقدر نادر باشد که بتوان آن را بدون توجه نادیده گرفت. اگر یک میلیارد UUID در ثانیه برای یک قرن کامل تولید کنید، با فرض وجود آنتروپی کافی، احتمال مواجهه با یک تکراری حدود ۵۰ درصد خواهد بود.

شما می توانید از UUID ها برای ایجاد هویت مستقل از پایگاه داده خود، قبل از درج استفاده کنید. این کد سطح برنامه را ساده می کند و از ماندن اشیاء نادرست تعریف شده در سیستم شما جلوگیری می کند. UUID ها همچنین بر خلاف کلیدهای عدد صحیح سنتی که در سطح جدول کار می کنند، با اطمینان از منحصر به فرد بودن صرف نظر از ذخیره داده، دستگاه یا محیط، به تکثیر داده ها کمک می کنند.

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

واضح ترین چالش برای اکثر توسعه دهندگان در مورد ذخیره سازی و بازیابی UUID های تولید شده است. ساده لوحانه استفاده می کند VARCHAR(36) (یا خط فاصله را بردارید و استفاده کنید VARCHAR(32)) می تواند برنامه شما را در طول زمان فلج کند زیرا اکثر بهینه سازی های نمایه سازی پایگاه داده بی اثر خواهند بود. به قابلیت های پردازش UUID تعبیه شده در سیستم پایگاه داده خود نگاه کنید تا مطمئن شوید که بهترین عملکرد ممکن را از راه حل خود دریافت می کنید.

رژیم آنلاین دکتر روشن ضمیر https://rdiet.ir/ رژیم کتوژنیک دکتر روشن ضمیر