UUID، ULID و Sqid: کدوم شناسه به درد کجا میخوره؟
خلاصهٔ کاملتر
به گفتهٔ نویسنده، انتخاب شناسه تا وقتی اپ کوچیکه یه تصمیم کوچیک به نظر میاد؛ اما همین که بخوای تو چند سرویس رکورد بسازی، آیدی ترتیبی دیتابیس رو تو URL عمومی لو ندی، یا شناسهای بخوای که تقریباً بر اساس زمان مرتب باشه، پای UUID و ULID و Sqid وسط میاد. نویسنده میگه سؤال درست «کدوم بهتره؟» نیست؛ اینه که این شناسه تو این قسمت از سیستم چه خاصیتی لازم داره.
UUID یه شناسهٔ ۱۲۸ بیتی استانداردشدهست (RFC 9562) که معمولاً به شکل ۳۶ کاراکتری هگز نوشته میشه. UUIDv4 کاملاً تصادفیه و بدون هماهنگی با هیچ سرویسی ساخته میشه، ولی چون بر اساس زمان مرتب نمیشه، بهعنوان کلید اصلی درجها رو تو کل ایندکس B-tree پخش میکنه و page split بیشتری میسازه. UUIDv7 همین رو حل میکنه: ۴۸ بیت تایماستمپ میلیثانیهای اول شناسه میشینه، پس مقدارها طبیعی مرتب میشن — به قیمت اینکه زمان تقریبی ساخت لو میره.
ULID هم ۱۲۸ بیته، اما رشتهش با الفبای Base32 کراکفورد فقط ۲۶ کاراکتره: ۴۸ بیت تایماستمپ و ۸۰ بیت تصادفی. نتیجهش شناسهای کوتاهتر، URL-safe و مرتبشدنی بهصورت لغوی هست. برای وقتی که چند ULID تو یه میلیثانیه ساخته میشن، اسپک یه حالت monotonic داره که بخش تصادفی رو یکییکی جلو میبره تا ترتیب حفظ شه.
مدل ذهنی Sqid فرق داره: Sqid شناسهٔ مستقل نیست، بلکه از یک یا چند عدد نامنفی — معمولاً همون کلید عددی دیتابیس — ساخته میشه و کوتاه و URL-safe هست. یعنی بهجای مسیر عمومی با آیدی خام، میتونی یه رشتهٔ کوتاه نشون بدی و لبِ ورودی دیکودش کنی. ولی نویسنده تأکید میکنه Sqid برگشتپذیره: نه رمزنگاریه، نه هش، و مرز امنیتی حساب نمیشه.
$sqids = new Sqids();
$publicId = $sqids->encode([1, 2, 3]);
$numbers = $sqids->decode($publicId);نکات کلیدی:
- UUIDv4 برای شناسهٔ مبهم و توزیعشده خوبه، ولی بهعنوان کلید اصلی ایندکس رو پخش میکنه
- UUIDv7 تایماستمپ اول داره، پس مرتبه و برای سیستمهای append-heavy پیشفرض خوبیه
- ULID با ۲۶ کاراکتر از UUID کوتاهتره و لغوی مرتب میشه
- Sqid از عدد ساخته میشه، برگشتپذیره و جای توکن امنیتی نیست
- سؤال درست اینه که این شناسه تو این نقطه چه خاصیتی لازم داره




