TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #400 156
🎯 تولید کد منحصربه‌فرد (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 پرتاب کنید تا سیستم کنترل‌شده‌تر عمل کند.
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →