UUID واقعاً چیست
UUID، مخفف Universally Unique Identifier یا شناسه یکتای جهانی، یک مقدار ۱۲۸ بیتی است که برای برچسبگذاری یک چیز بدون نیاز به اجازه از کسی استفاده میشود. شاید آن را GUID یا Globally Unique Identifier هم ببینید، که فقط نامی است که مایکروسافت به همین ایده در ویندوز و دنیای .NET داده است. این دو اصطلاح در تقریباً هر موردی که اهمیت دارد همان عدد ۱۲۸ بیتی را توصیف میکنند، پس وقتی یک همکار GUID میگوید و شما UUID، تقریباً همیشه از یک چیز صحبت میکنید.
این ۱۲۸ بیت معمولاً به صورت ۳۲ رقم هگزادسیمال در پنج گروه با خط تیره نوشته میشوند، در الگوی ۸-۴-۴-۴-۱۲. یک نمونه معمولی شبیه 123e4567-e89b-12d3-a456-426614174000 است. خط تیرهها خودشان هیچ معنایی ندارند؛ فقط وجود دارند تا انسان بتواند مقدار را بدون گم شدن بخواند. هر کاراکتر یک رقم هگزادسیمال از ۰ تا f است، که به همین دلیل UUID حتی با اینکه در زیر فقط یک عدد صحیح بسیار بزرگ است، از یک عدد روزمره متراکمتر به نظر میرسد.

نسخهها، و چرا v4 برنده است
استاندارد چندین نسخه تعریف میکند که در نحوه پر شدن بیتها تفاوت دارند. نسخه ۱ مبتنی بر زمان است: تایماستمپ فعلی و آدرس MAC شبکه دستگاه را با هم ترکیب میکند. این مقادیر v1 را بر اساس زمان ایجاد قابل مرتبسازی میکند، اما همچنین اطلاعاتی درباره اینکه کجا و تقریباً چه زمانی ساخته شدهاند فاش میکند، که همیشه مطلوب نیست. نسخههای ۳ و ۵ مبتنی بر نام هستند و یک فضای نام به علاوه یک نام را هش میکنند تا همان ورودی همیشه همان شناسه را تولید کند.
نسخه ۴ مسیر کاملاً متفاوتی دارد. تقریباً خالص تصادفی است. از ۱۲۸ بیت، شش بیت برای مشخص کردن نسخه و نوع رزرو شدهاند و ۱۲۲ بیت با داده تصادفی پر میشوند. هیچ تایماستمپ، MAC آدرس یا فضای نامی وجود ندارد، فقط نویز. دقیقاً به همین دلیل است که اکثر مولدها، از جمله این یکی، به طور پیشفرض v4 تولید میکنند. چیزی درباره دستگاه یا لحظه ایجاد فاش نمیکند، و به هماهنگی بین طرفهای سازنده نیاز ندارد. ابزار این صفحه کاملاً در مرورگر شما اجرا میشود، پس مقادیر تصادفی هرگز از دستگاه شما خارج نمیشوند.
احتمال واقعی تکرار چقدر است
نگرانی منطقی این است که دو UUID تصادفی روزی ممکن است یکسان باشند. با ۱۲۲ بیت تصادفی، فضای مقادیر ممکن v4 برابر ۲ به توان ۱۲۲ است، که تقریباً ۵.۳ به دنبال ۳۶ صفر میشود. برای درک بهتر، باید میلیاردها UUID در هر ثانیه برای دهههای بسیار تولید کنید تا احتمال یک تکراری واحد به چیز قابل اندازهگیری برسد. خود استاندارد احتمال تصادم را آنقدر نزدیک به صفر توصیف میکند که قابل چشمپوشی است. در عمل تیمها v4 را یکتا میدانند و ادامه میدهند، و درست هم هست.

کجا توسعهدهندگان از آنها استفاده میکنند
چون یکتایی به هیچ مرجع مرکزی نیاز ندارد، UUID در جاهایی که هماهنگی گران یا غیرممکن است میدرخشد. گزینه طبیعی برای کلیدهای اصلی پایگاه داده هستند، به خصوص وقتی چندین سرویس ردیف درج میکنند و نمیتوانید منتظر بمانید که یک شمارنده مشترک شماره بعدی را بدهد. در سیستمهای توزیعشده، دو گره در دو طرف مختلف کره زمین میتوانند در یک لحظه شناسه بسازند بدون اینکه هرگز با هم تداخل داشته باشند. همچنین کلیدهای idempotency در API را هدایت میکنند، جایی که کلاینت یک UUID به درخواست متصل میکند تا سرور بتواند یک تکراری را اگر شبکه مجدداً تلاش کرد با خیال راحت نادیده بگیرد. توکنهای جلسه، نام فایلها، شناسههای رویداد، و کلیدهای پیام همه به همین خاصیت متکی هستند.
UUID در برابر شناسههای auto-increment
جایگزین کلاسیک، عدد صحیح auto-increment است: ۱، ۲، ۳، و الی آخر. شناسههای ترتیبی فشرده هستند، به طور طبیعی مرتب میشوند و خواندنشان آسان است، اما معایب واقعی دارند. آنها نشان میدهند چند رکورد وجود دارد و به اشخاص بیرونی اجازه میدهند مقادیر مجاور را حدس بزنند، و هر درج را از طریق یک شمارنده واحد مجبور میکنند که وقتی پایگاه داده را شارد میکنید یا داده را از منابع متعدد ادغام میکنید گلوگاه میشود. UUID این مشکلات را با اینکه به هر طرفی اجازه میدهد کلید را مستقلاً تولید کند و با عدم افشای هیچ چیز درباره حجم یا ترتیب حل میکند. معاوضه اندازه و کمی کمتر تمرکز در ایندکسهاست. برای سیستمهایی که مقیاس میشوند یا باید اطلاعات داخلی را پنهان کنند، این معاوضه معمولاً ارزشش را دارد. میتوانید این و ابزارهای مشابه را در مجموعه همه مولدها کاوش کنید، یا مجموعه گستردهتر ابزارهای توسعهدهنده را برای بلوکهای ساختاری مرتبط مرور کنید.
سوالات متداول
آیا GUID همان UUID است؟
برای اهداف روزمره، بله. GUID نام مایکروسافت برای همان شناسه ۱۲۸ بیتی است. تنها تفاوت واقعی ترتیب بایت در فرم باینری خام در برخی سیستمهای ویندوز است؛ در فرم رشتهای یکسان و قابل جابجایی هستند.
این ابزار کدام نسخه UUID تولید میکند؟
نسخه ۴، نوع تصادفی را تولید میکند. از ۱۲۸ بیت آن، ۱۲۲ بیت با داده تصادفی پر میشود، که هر مقداری را بسیار بعید از تکرار میکند و به این معنی است که هیچ تایماستمپ یا اطلاعات دستگاهی ندارد.
آیا دو UUID میتوانند یکسان باشند؟
از نظر تئوری احتمال دقیقاً صفر نیست، اما با حدود ۵.۳ ضربدر ۱۰ به توان ۳۶ مقدار ممکن v4، آنقدر کوچک است که قابل چشمپوشی میدانند. باید تعداد نجومی از آنها تولید کنید تا یک تصادم محتمل شود.
چرا از UUID به جای عدد auto-increment استفاده کنیم؟
UUID میتواند توسط هر سرویسی به طور مستقل بدون شمارنده مشترک ساخته شود، تعداد رکوردها یا ترتیب را آشکار نمیکند، و ادغام داده از منابع مختلف را بدون دردسر میکند. شناسههای auto-increment کوچکترند اما در مقیاس گلوگاه میشوند و اطلاعات درز میکنند.
آیا UUID ها روی سرور تولید میشوند؟
نه. این ابزار کاملاً در مرورگر شما اجرا میشود، پس مقادیر تصادفی به صورت محلی تولید میشوند و هرگز به جایی ارسال نمیشوند. این استفاده از آنها برای کلیدها و توکنهایی که میخواهید خصوصی بمانند را امن میکند.
الگوی خط تیره به چه معنی است؟
گروهبندی ۸-۴-۴-۴-۱۲ فقط یک قرارداد خوانایی است. خط تیرهها دادهای حمل نمیکنند؛ ۳۲ رقم هگزادسیمال را به تکههایی تقسیم میکنند تا مردم بتوانند مقادیر را راحتتر مرور و مقایسه کنند.
