استفاده Splync از دو شناسه برای شناسههای حساس
در پایگاه داده Splync، هر کاربر و هر پروژه با دو شناسه مختلف شناسایی میشود: یک UUID و یک عدد صحیح خودافزایشی.
عدد صحیح خودافزایشی همان چیزی است که بسیاری از مردم با آن آشنا هستند — فقط یک شمارنده است: 1، 2، 3 و غیره. Splync از این اعداد برای سازماندهی تقریباً هر جدول در پایگاه داده سرور استفاده میکند زیرا ساده، سریع و کارآمد برای پیوندها است. با این حال، ما هرگز این اعداد داخلی را به برنامه نشان نمیدهیم. به عنوان مثال، اگر شما چهل و دومین کاربری بودید که ثبت نام کردید، شناسه داخلی شما در پایگاه داده ۴۲ خواهد بود. اما برنامه iOS شما هرگز عدد “۴۲” را نمیبیند. در عوض، برنامه از یک UUID برای نمایش شما استفاده میکند. ما همان رویکرد را برای پروژهها نیز اعمال میکنیم — شناسه پروژه ممکن است "۷" در پایگاه داده باشد، اما برنامه همیشه با استفاده از یک UUID طولانی به آن اشاره میکند.
UUID چیست؟
UUID به معنای شناسه منحصربهفرد جهانی است. Splync از UUIDهای نسخه ۴، نوع ۱ استفاده میکند که با RFC 4122 سازگار است — یکی از گستردهترین استانداردهای پذیرفته شده. این یک رشته تصادفی تولید شده است که به شکل 949ca11c-a6ed-48a3-b40a-fa9727494917 به نظر میرسد. یک UUID معمولاً به عنوان ۳۲ کاراکتر هگزادسیمال نوشته میشود که به پنج بخش تقسیم شده و با خط تیره جدا شدهاند. این طراحی شده است تا به صورت جهانی منحصربهفرد باشد، به این معنی که حتی در سرورها یا پایگاههای داده مختلف با هم تداخل نخواهد داشت. به طور ریاضی، حدود ۱۶^۳۲ = ۲^۱۲۸ ترکیب ممکن وجود دارد. با این حال، از آنجا که شش بیت برای نشان دادن نوع و نسخه رزرو شدهاند، تعداد کل UUIDهای متمایز نسخه ۴، نوع ۱ در حدود ۲^۱۲۲ یا حدود ۵.۳ × ۱۰^۳۶ است — عددی فوقالعاده بزرگ که اطمینان از منحصر بودن عملی را فراهم میکند.
عدد 1 / 5,300,000,000,000,000,000,000,000,000,000,000,000 چقدر کوچک است؟
هر جفت از UUIDv4 حدود ۱ در ۵.۳ × ۱۰^۳۶ احتمال تطابق دارند. این عدد آنقدر کوچک است که تقریباً در تخیل انسانی وجود ندارد. برای تصور آن، تصور کنید که ۴۷ تاس را به یکباره پرتاب کنید. احتمال اینکه همه یک باشند — هر تاس عدد “۱” را نشان دهد — حدود ۱ در ۶^۴۷ یا تقریباً ۱ در ۳.۷ × ۱۰^۳۶ است. این همان مرتبهی بزرگی به عنوان یک برخورد UUID است. حالا تصور کنید که هر فرد روی زمین — حدود هشت میلیارد نفر از ما — آن ۴۷ تاس را هر میلیثانیه برای یک تریلیون سال پرتاب میکند. این حدود ۲.۵ × ۱۰^۳۲ تلاش کل است. حتی پس از همه اینها، احتمال اینکه کسی، جایی، ۴۷ یک را به یکباره بگیرد، هنوز تنها یک در ده هزار خواهد بود. به همین دلیل است که دو UUIDv4 به ندرت با هم برخورد میکنند. این اتفاق نادر نیست؛ به طرز غیرقابل تصوری دور از انتظار است — اتفاقی که میتواند ریاضیدانان را وادار کند قهوهشان را بیاندازند و جهان را برای باگها بررسی کنند.
آیا تولید یک UUID آسان است؟
در نگاه اول، تولید یک UUID ممکن است ساده به نظر برسد — به هر حال، این فقط یک رشته الفباییعددی تصادفی به نظر میرسد. اما سعی کنید خودتان یکی را با قلم و کاغذ بنویسید. شما میتوانید ۳۶ کاراکتر را بنویسید، قطعاً، اما اگر این تمرین را هزاران بار تکرار کنید، الگوهای واضحی پدیدار میشوند. شاید شما برخی ارقام مانند ۳ یا ۸ را ترجیح میدهید و به ندرت از حروفی مانند x استفاده میکنید. یک کامپیوتر میتواند این تمایلات را بلافاصله شناسایی کند. یک هکر مخرب میتواند عادات شما را تحلیل کند و رشتهی "تصادفی" مخفی شما را در عرض یک روز محدود کند. سپس، اگر به یک کامپیوتر مراجعه کنید و rand()، تابع تصادفی کلاسیک، را برای تولید هر رقم فراخوانی کنید. این بهتر است — اما کافی نیست. بسیاری از تولید کنندههای عدد "تصادفی" در محیطهای برنامهنویسی رایج، شبهتصادفی هستند، به این معنی که آنها یک دنباله ریاضی قابل پیشبینی را از یک بذر داخلی شروع میکنند که معمولاً بر اساس زمان سیستم است. اگر کسی آن بذر را کشف یا حدس بزند، میتواند هر مقداری که تولید کننده شما تولید کرده است را بازتولید کند.
یک UUID چقدر کاملاً تصادفی است؟
تصادف کامل واقعاً وجود ندارد — همانطور که یک تاس کامل وجود ندارد، یا یک پرتاب تاس کاملاً تصادفی وجود ندارد. هر فرآیند فیزیکی یا دیجیتالی از قوانینی پیروی میکند. با این حال، ریاضیدانان و مهندسان دههها وقت صرف طراحی الگوریتمهایی کردهاند که تا حد ممکن به تصادف واقعی نزدیک شوند. وقتی Splync یک UUID نسخه ۴ جدید ایجاد میکند، به سادگی "اعداد را به صورت تصادفی انتخاب نمیکند" مانند پرتاب تاس. بلکه از سیستم عامل برای دریافت ردپایهای ناچیز عدم پیشبینی میخواهد — به عنوان مثال، لحظه دقیق تکمیل یک کار توسط CPU شما، نویز الکتریکی خفیف داخل سختافزار، یا نوسانات زمانی در حافظه. این قطعات از آنتروپی جمعآوری و با هم در ۱۲۸ بیت داده مخلوط میشوند — یک دنباله طولانی از یکها و صفرها. نتیجه کدی است که برای کاربران برنامه یا مهاجمان مخرب احتمالی تقریباً غیرممکن است که حدس بزنند یا تکرار کنند.
رویکرد دوگانه شناسایی Splync
Splync از UUIDها برای شناسههای حساس مثل شناسههای کاربران و پروژهها استفاده میکند، زیرا این شناسهها بسیار تصادفی و امن هستند.
در عین حال، در سرور خود Splync این UUIDها را به اعداد صحیح خودافزایشی تبدیل میکند تا جستجو و تحلیل سریعتری بر روی مجموعه دادههای بزرگ انجام دهد. این رویکرد دوگانه بین امنیت و راحتی تعادل برقرار میکند — حریم خصوصی خارجی با عملکرد داخلی. هدف Splync این است که یک برنامه پیگیری بودجه بدون استرس، ساده و امن باشد. پشت رابط کاربری قابل مشاهده، ما همچنان در حال بهبود معماری خود برای حفظ امنیت، روانی و هوشمندی بیصدا هستیم.