سطح مقدماتی (Beginner Level)
در بسیاری از برنامهها نیاز داریم شناسههایی تولید کنیم که در کل سیستم (یا حتی در کل دنیا) منحصربهفرد باشند. استفاده از اعداد ترتیبی (مثل 1، 2، 3) همیشه ممکن نیست، مخصوصاً در سیستمهای توزیعشده. اینجاست که UUID (Universally Unique Identifier) وارد میشود. پایتون ماژول استاندارد uuid را برای این کار ارائه میدهد.
مفهوم UUID چیست؟
کلمه UUID مخفف "شناسه منحصربهفرد جهانی" است. این یک رشته ۱۲۸ بیتی است که معمولاً به صورت ۳۲ کاراکتر هگزادسیمال نمایش داده میشود. احتمال تکراری بودن یک UUID (مخصوصا نسخه ۴) آنقدر پایین است که در عمل میتوان آن را صفر در نظر گرفت.
تولید سریع UUID تصادفی (UUID4)
رایجترین نسخه مورد استفاده، UUID4 است که کاملاً بر پایه تصادف (Random) ساخته میشود.
مثال ۱: تولید یک شناسه ساده
در این مثال سادهترین روش دریافت یک شناسه یکتا را میبینیم.
مثال ۲: تبدیل به رشته (String)
خروجی uuid.uuid4() یک شیء (Object) است. برای ذخیره در دیتابیس یا ارسال در API، معمولاً نیاز داریم آن را به رشته تبدیل کنیم.
مثال ۳: استفاده در نامگذاری فایل
یکی از کاربردهای اصلی UUID، نامگذاری فایلهای آپلود شده توسط کاربر است تا از تداخل نامها جلوگیری شود.
import uuid
import os
def generate_unique_filename(original_filename):
# جدا کردن پسوند فایل
_, ext = os.path.splitext(original_filename)
# ساخت نام جدید با UUID
new_name = f"{uuid.uuid4()}{ext}"
return new_name
# مثال استفاده (اجرا نمیشود چون تابع است)
# print(generate_unique_filename("my-photo.jpg"))
# خروجی احتمالی: 4a3e2b1c-9081-4d2a-8c11-9f8e7d6c5b4a.jpg
سطح پیشرفته (Professional Level)
در سطح حرفهای، باید تفاوت نسخههای مختلف UUID را بدانید، بتوانید آنها را اعتبارسنجی کنید و با نحوه بهینه ذخیرهسازی آنها آشنا باشید.
انواع نسخههای UUID
ماژول uuid پایتون از نسخههای ۱، ۳، ۴ و ۵ پشتیبانی میکند.
- UUID1: بر اساس زمان جاری و آدرس MAC کارت شبکه سیستم ساخته میشود.
- مزیت: تضمین یکتایی مطلق (چون آدرس MAC یکتاست).
- عیب: افشای آدرس MAC (حریم خصوصی) و وابستگی به سختافزار.
- UUID4: کاملاً تصادفی. (پیشنهاد ما برای ۹۹٪ مواقع).
- UUID3 و UUID5: بر اساس یک نام (مثل نام دامنه یا یوزرنیم) و یک Namespace ساخته میشوند.
- ویژگی: قطعی (Deterministic) هستند. یعنی اگر ورودی یکسان بدهید، همیشه خروجی یکسان میگیرید.
- تفاوت: نسخه ۳ از MD5 استفاده میکند (قدیمی)، نسخه ۵ از SHA-1 (امنتر).
تولید UUID قطعی (Namespace Based)
اگر میخواهید برای یک نام کاربری خاص، همیشه یک ID ثابت تولید کنید، از uuid5 استفاده کنید.
مثال ۱: ساخت UUID5
اعتبارسنجی UUID (Validation)
وقتی یک رشته از سمت کاربر (مثلاً در URL) میآید، باید بررسی کنید که آیا فرمت آن واقعاً UUID است یا خیر.
مثال ۱: تابع اعتبارسنجی ایمن
نکات پرفرمنس و دیتابیس
ذخیره UUID به صورت رشته ۳۶ کاراکتری (با خط تیره) یا ۳۲ کاراکتری (بدون خط تیره) فضای زیادی میگیرد.
- Database Storage: در دیتابیسهای بزرگ (مثل PostgreSQL)، بهتر است از نوع داده
UUIDنیتیو استفاده کنید یا آن را به صورت Binary (16 bytes) ذخیره کنید، نه String. - دسترسی به بایتها: شیء UUID در پایتون دسترسی مستقیم به بایتها را میدهد.
مثال ۱: تبدیل به بایت برای ذخیرهسازی بهینه
ساختار داخلی (Fields)
یک UUID از بخشهای مختلفی تشکیل شده است (time_low, time_mid, ...). هرچند در نسخه ۴ اینها تصادفی هستند، اما در نسخه ۱ معنی دارند.