🎯 تولید کد منحصربهفرد (Unique Code Generation) در URL Shortener
یکی از مهمترین بخشهای سیستم کوتاهکننده لینک، تولید کد منحصربهفرد برای هر URL است.
الگوریتمهای مختلفی برای پیادهسازی این بخش وجود دارد، اما هدف ما این است که کدها بهصورت یکنواخت در میان تمام مقادیر ممکن توزیع شوند تا احتمال برخورد (collision) کاهش یابد. ⚖️
⚙️ رویکرد انتخابی ما
در این پیادهسازی از تولید کد تصادفی (Random Unique Code Generator) با استفاده از یک الفبای از پیش تعریفشده (Predefined Alphabet) استفاده میکنیم.
این روش ساده است و احتمال برخورد در آن بسیار پایین است — هرچند راهحلهای بهینهتر و سریعتری هم وجود دارد که بعداً به آنها اشاره خواهیم کرد.
🧩 تعریف تنظیمات کوتاهسازی لینک
ابتدا یک کلاس به نام ShortLinkSettings تعریف میکنیم که شامل دو مقدار ثابت (constant) است:
یکی برای تعیین طول کد کوتاه و دیگری برای الفبایی که قرار است از آن کاراکترها انتخاب شوند.
public static class ShortLinkSettings
{
public const int Length = 7;
public const string Alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
}
🔢 این الفبا شامل ۶۲ کاراکتر است (۲۶ حرف بزرگ + ۲۶ حرف کوچک + ۱۰ عدد).
بنابراین، تعداد ترکیبهای ممکن برابر خواهد بود با:
62⁷ = 3,521,614,606,208
یا بهصورت خوانا:
سه تریلیون و پانصد بیست و یک میلیارد و ششصد و چهارده میلیون و ششصد و شش هزار و دویست و هشت ترکیب منحصربهفرد! 😮
این مقدار بهراحتی برای اکثر سیستمهای URL Shortener کافی است.
🧠 پیادهسازی سرویس تولید کد (UrlShorteningService)
در ادامه، یک کلاس به نام UrlShorteningService پیادهسازی میکنیم که وظیفهی تولید کد تصادفی و بررسی یکتایی آن در دیتابیس را برعهده دارد.
public class UrlShorteningService(ApplicationDbContext dbContext)
{
private readonly Random _random = new();
public async Task<string> GenerateUniqueCode()
{
var codeChars = new char[ShortLinkSettings.Length];
const int maxValue = ShortLinkSettings.Alphabet.Length;
while (true)
{
for (var i = 0; i < ShortLinkSettings.Length; i++)
{
var randomIndex = _random.Next(maxValue);
codeChars[i] = ShortLinkSettings.Alphabet[randomIndex];
}
var code = new string(codeChars);
if (!await dbContext.ShortenedUrls.AnyAsync(s => s.Code == code))
{
return code;
}
}
}
}
🔍 در این کد:
برای هر کاراکتر از کد کوتاه، یک مقدار تصادفی از Alphabet انتخاب میشود.
سپس با دیتابیس بررسی میکنیم که آیا این کد قبلاً استفاده شده است یا خیر.
اگر کد منحصربهفرد بود، آن را برمیگردانیم؛ در غیر این صورت، مجدداً تلاش میکنیم.
⚠️ نقاط ضعف و بهبودهای احتمالی
1️⃣ افزایش زمان پاسخ (Latency):
در حال حاضر، هر بار باید با دیتابیس چک کنیم که آیا کد تکراری است یا خیر.
✅ راهحل: میتوان کدهای منحصربهفرد را پیشاپیش در دیتابیس تولید و ذخیره کرد تا در لحظه نیازی به بررسی نباشد.
2️⃣ حلقه بینهایت:
اگر برخوردهای متوالی اتفاق بیفتند، این پیادهسازی تا بینهایت تکرار خواهد شد.
✅ راهحل: بهجای while (true)، از یک تعداد تکرار ثابت استفاده کنید و در صورت تکرار زیاد، Exception پرتاب کنید تا سیستم کنترلشدهتر عمل کند.