tnfy.link – ID چیست؟

سلام به همه!
به قسمت دوم مجموعه من در مورد tnfy.link خوش آمدید – یک کوتاه کننده URL دیگر! در این پست، به فرآیند جذاب ایجاد لینک های کوتاه می پردازیم. در حالی که این ممکن است ساده به نظر برسد، انتخاب روش مناسب برای تولید لینک با چالش های منحصر به فردی همراه است.
در اصل، ایجاد یک پیوند کوتاه شامل ایجاد یک شناسه کوتاه و منحصر به فرد برای هر URL طولانی است. شناسه باید چندین معیار را داشته باشد:
- باشد منحصر به فرد برای جلوگیری از درگیری
- باشد به اندازه کافی کوتاه برای استفاده عملی
- باشد آسان برای تایپ بدون ارائه خطا
- باشد غیر قابل پیش بینی برای جلوگیری از حدس زدن
پس از تحقیق در مورد رویکردهای مختلف، چهار روش اصلی را برای ایجاد پیوندهای کوتاه شناسایی کردم. بیایید آنها را با جزئیات بررسی کنیم.
1. بایت های تصادفی
ساده ترین روش شامل تولید بایت های تصادفی و رمزگذاری آنها است. با این حال، درک تفاوت بین اعداد تصادفی شبه تصادفی و رمزنگاری امن بسیار مهم است.
اعداد شبه تصادفی
این math/rand
بسته در Go یک مولد اعداد شبه تصادفی (PRNG) ارائه می دهد. با همان دانه (مقدار اولیه)، همان دنباله اعداد را تولید می کند. در حالی که این برای بسیاری از برنامه ها کافی است، اما برای تولید لینک ایمن یا غیرقابل پیش بینی مناسب نیست.
اعداد تصادفی از نظر رمزنگاری ایمن
برای اعداد تصادفی ایمن تر، crypto/rand
بسته ایده آل است با استفاده از نویز سیستم، مقادیر واقعا تصادفی و غیرقابل پیش بینی تولید می کند. به عنوان مثال، نویز الکترومغناطیسی گرفته شده در سطح فیزیکی را می توان استفاده کرد. این آنتروپی بالا را تضمین میکند، اما به خاطر داشته باشید که ماشینهای مجازی ممکن است برای دادههای تصادفی به میزبان خود متکی باشند، که میتواند تولید را در محیطهای پر بار کند کند.
رمزگذاری بایت های تصادفی
بایت های تصادفی به تنهایی برای URL ها مناسب نیستند، بنابراین باید کدگذاری شوند. در اینجا رایج ترین روش های رمزگذاری آورده شده است:
- عدد صحیح: بایت ها را به عدد صحیح تبدیل می کند. تایپ آسان است اما ممکن است منجر به شناسه های طولانی تر شود.
- HEX: بایت ها را به صورت هگزادسیمال (0-9، AF) کد می کند. حساس به حروف کوچک و مقاوم در برابر تایپی
-
پایه 64: بایت ها را با کاراکترهای AZ، az، 0-9 رمزگذاری می کند،
+
،/
، و=
. با این حال، به حروف کوچک و بزرگ حساس است و مستعد اشتباهات تایپی است. -
پایه 58: شبیه Base64 است اما کاراکترهای گیج کننده را حذف نمی کند (به عنوان مثال،
I
،l
،O
،0
). این باعث می شود کاربر پسندتر باشد. به عنوان مثال می توان به پیاده سازی توسط بیت کوین، ریپل و فلیکر اشاره کرد.
برای پیوندهای کوتاه کاربر پسند، پایه 58 به دلیل توازن فشردگی و مقاومت در برابر خطا، اغلب بهترین انتخاب است.
نکات کلیدی:
- بایت های تصادفی منحصر به فرد و غیرقابل پیش بینی هستند.
- روش های رمزگذاری مانند Base58 قابلیت استفاده را افزایش می دهد.
- تصادفی ایمن رمزنگاری، قابلیت اطمینان را تضمین می کند.
2. هش کردن
هش شامل تولید یک مقدار با طول ثابت بر اساس ورودی است (مثلاً URL طولانی). در حالی که ثبات را تضمین می کند – هش کردن ورودی یکسان همیشه خروجی یکسانی را تولید می کند – فاقد تصادفی بودن است. این بدان معناست که درخواستهای متعدد برای کوتاه کردن یک URL یکسان، شناسههای یکسانی را به دست میآورند، که الزامات غیرقابل پیشبینی را برآورده نمیکند.
افزودن نمک تصادفی به ورودی قبل از هش میتواند تنوع را ایجاد کند، اما در آن مرحله، استفاده از بایتهای تصادفی خام سادهتر و کارآمدتر میشود.
3. UUID
UUID ها (شناسه های منحصر به فرد جهانی) به طور گسترده برای تولید مقادیر منحصر به فرد استفاده می شوند. در حالی که آنها موثر هستند، قالب پیش فرض آنها برای پیوندهای کوتاه بسیار طولانی است. با این حال، رمزگذاری مجدد UUID ها (به عنوان مثال، در Base58) می تواند اندازه آنها را کاهش دهد.
جایگزینی برای UUID NanoID است که رشته های کوتاه تری (به طور پیش فرض 21 کاراکتر) با استفاده از الفبای قابل تنظیم تولید می کند. این به شما امکان می دهد شناسه ها را برای خوانایی و مقاومت در برابر خطا بهینه کنید.
چرا از UUID استفاده نمی کنید؟
UUID ها در نهایت بر اساس بایت های تصادفی هستند، بنابراین هیچ مزیت قابل توجهی نسبت به تولید مقادیر تصادفی خام به طور مستقیم وجود ندارد.
4. دنباله
مقادیر تصادفی گاهی اوقات می توانند منجر به تکرار شوند، به خصوص در بار زیاد یا با شناسه های کوتاه تر. در حالی که tnfy.link برای سناریوهای با بار بالا طراحی نشده است، هنوز ارزش بررسی مسائل احتمالی را دارد.
با استفاده از a شمارنده ترتیبی منحصر به فرد بودن را با طراحی تضمین می کند. ابزارهایی مانند Redis می توانند یک شمارنده توزیع شده را با INCR
فرمان با این حال، شناسه های متوالی قابل پیش بینی هستند. ترکیب یک دنباله با بایت های تصادفی به این موضوع می پردازد و هم منحصر به فرد بودن و هم غیرقابل پیش بینی بودن را تضمین می کند.
به عنوان مثال:
- مقدار تصادفی + دنباله افزایشی: اگر دو نمونه مقدار تصادفی یکسانی تولید کنند، توالی یکتایی را تضمین می کند.
توجه داشته باشید: گنجاندن یک مؤلفه متوالی در شناسههای شما ممکن است تعداد کل پیوندهای ایجاد شده را نشان دهد که در برخی زمینهها میتواند نامطلوب باشد.
نتیجه گیری
در این پست روش های مختلفی برای ایجاد لینک های کوتاه بررسی کردیم:
- بایت های تصادفی: ساده و موثر، به خصوص با رمزگذاری ایمن مانند Base58.
- هش کردن: قابل اعتماد اما فاقد تصادفی بودن برای این مورد است.
- UUID/NanoID: جایگزین های عالی اما پیچیدگی غیر ضروری را در مقایسه با بایت های تصادفی خام اضافه می کند.
- دنباله: برخوردها را حل می کند اما طول ID را افزایش می دهد.
برای بیشتر موارد استفاده، بایت های تصادفی با رمزگذاری Base58 کافی هستند. برای مدیریت برخورد در سناریوهای بار بالا، ترکیب بایت های تصادفی با یک جزء متوالی یک گزینه قوی است. در حالی که این هنوز در نسخه فعلی backend tnfy.link پیاده سازی نشده است، من قصد دارم آن را به عنوان یک ویژگی اختیاری در آینده اضافه کنم.
با تشکر برای خواندن! من دوست دارم نظرات و تجربیات شما را در مورد تولید لینک بشنوم. نظرات خود را در نظرات زیر به اشتراک بگذارید!
پست مرتبط
اگر علاقه مند به کسب اطلاعات بیشتر در مورد پروژه های من هستید، مقاله من در مورد دروازه SMS برای اندروید را بررسی کنید.