ساختن شناسه عددی به منظور پیگیری یا احراز هویت در کانستراکت 2 + پـیاده سـازی
#1
Lightbulb 
به نام خـدا
سلام دوستان امیدوارم حالتون خوب باشه؛
حـتماً تا به حـال به شناسه های عددی مثل کدهای ملی، شماره کـارت های بانکی، شناسه های IMEI دستگاه های موبایلی و ... برخورد کردین. اگر دقت کرده باشین یه نظم (قانون) خـاصی بین ارقام این شناسه های عددی برقراره که این امکان رو فراهم میکنه که ارقـام اون شناسه ها از نظر ساختاری اعتبارسنجی بشن. برای ساخت چنین شناسه هایی از الگوریتم لان (Luhn Algorithm) استفاده میکنن. این الگوریتم پیچیدگی محاسباتی خاصی نداره و تنها با چند عمل ساده ریاضی قابل پیاده سازی و اجراست. در ادامه مطلب بیشتر راجع به ساز و کـار این الگوریتم صحبت میکنیم.
سیاست گذاری برای شناسه های عددی:
قبل از انجام هـر کـاری باید یه سیاست مشخص رو برای خودمون تهیه و تدوین کنیم. این سیاست بر پایه دو پرسش اصلی باید تنظیم بشه. اولین پرسش این هست که بدونیم قراره در نهایت چـه تعداد شناسه عددی ایجاد کنیم و ازشون بهره برداری کنیم. دومین پرسش هم که تابعی از پرسش اوله این هست که بدونیم شناسه های عددی که ایجاد میکنیم باید چند رقمی باشن. مشخصاً برای پاسخ به این دو سؤال مـهم باید یه نیم نگاهی به ساختار شناسه های عددی که به کمک این الگوریتم ساخته میشن داشته باشیم.
 [تصویر:  Picture1.png]
همینطور که مشخصه در نمونه بالا ما یک شناسه عددی چهار رقمی داریم. راجع به سه رقم اول از سمت چپ که بحثی نداریم اما راجع به رقم چهارم از سمت چپ (اولین رقم از سمت راست) یه سری صحبت هایی داریم. به بیان واضح تر، هر شناسه عددی n رقمی که به کمک الگوریتم لان ساخته میشه اولین رقم از سمت راستش (n اُمین رقم از سمت چپش) دست ما نیست و توسط الگوریتم محاسبه و مقداردهی میشه. به این رقم در اصطلاح رقم پیگیری میگیم. پس با این حساب اون چیزی که دست ما هست و ما نسبت بهش اختیار داریم n-1 رقم از یک شناسه عددی n رقمی هست. توی نمونه (مثال) بالا هم دقیقاً از بین 4 رقم شناسه عددی ما نسبت به (3=1-4) رقـم اختیار و اراده داشتیم.

تا به اینجای کار و با توضیحاتی که مطرح شد میتونیم راجع به اولین پرسش اظهار نظر کنیم. فرض کنیم قصد داریم توی پروژه مون برای هر کاربر یک شناسه عددی منحصر به فرد ایجاد کنیم و در یک پایگاه داده در سمت سرور اون شناسه رو ذخیره کنیم. مسلماً نیاز داریم که یک برآوردی از تعداد کـاربرهایی که پروژه مون بعد از انتشار جذب میکنه در مراحل توسعه و طراحی پـروژه داشته باشیم. اگر حدسمون رو بر مبنای 200 هزار کـاربر قرار بدیم، شناسه های عددی باید چند رقمی باشن تا به مشکل بر نخوریم؟ این همون پرسش دومه که باید پاسخ مناسبی بهش بدیم. به کمک مبحث ترکیبات در ریاضیات میتونیم به رابطه (فرمول) زیر برسیم که در اون مشخص میکنیم که با n رقم میتونیم چند شناسه عددی منحصر به فرد به کمک الگوریتم لان ایجاد کنیم. 
[تصویر:  Picture2.png]
طبق رابطه بالا متوجه میشیم که تعداد ارقام شناسه هایی که قراره با این الگوریتم بسازیم باید دست کم برابر با دو عدد باشه. پس به کمک این رابطه میتونیم به پرسش دوم (تعداد ارقام شناسه های عددی) پاسخ بدیم. برگردیم به همون پروژه ای که حدس میزدیم 200 هزار کاربر رو بتونه جذب کنه. برای اینکه بتونیم 200 هـزار شناسه عددی ایجاد کنیم شناسه ها باید دست کم 7 رقمی باشن چـرا که طبق رابطه بالا ده به توان 6 (1-7) حاصلش یک میلیون میشه و اگر مقادیری کمتر از n = 7 رو در فرمول قرار بدیم می بینیم که حاصل به دست اومده کمتر از 200 هزار میشه بنابراین نمیتونیم اونها رو پذیرش کنیم.
 ایجاد شناسه های شرطی:
در اینجا مقصود و منظورم از لفظ «شرطی» اینه که بیایم یکسری حالات و شرایط خاص برای شناسه های عددی که قراره بسازیم در نظر بگیریم. مثلاً فرض کنیم توی همون مثال پروژه ای که مطرح کردیم قصد داشته باشیم چهار رقم اول از سمت چپ شناسه عددی سال تولد کاربر رو مشخص کنن. همچنین قصد داریم چهار رقم هم به صورت تصادفی بعد از عدد سال تولد کاربر قرار بگیرن. با این تفاسیر شناسه های عددی موردنظر ما ساختاری مشابه نمونه زیر خواهند داشت:
[تصویر:  Picture3.png]
در هر حال با هر ترکیب و شکلی که بخوایم شناسه های عددی رو ایجاد کنیم باید اولین رقم از سمت راست شناسه عددی رو به خروجی الگوریتم اختصاص بدیم و خودمون براش ایده ای نداشته باشیم. حالا با شروطی که کمی بالاتر برای خودمون سیاست گذاری کردیم در نهایت میتونیم چند شناسه عددی منحصر به فرد داشته باشیم؟
در مورد چهار رقم مربوط به سال تولد چون کاربر ما طبیعتاً بین بازه 1300 تا 1399 هجری شمسی متولد شده متوجه میشیم که هـر کاربری بدون استثناء حتماً دو رقم 1 و 3 رو از سمت چپ در عدد سال تولد خودش به همراه داره. راجع به دو رقم باقیمانده سال تولد هم میتونیم هر عدد دلخواهی رو متصور بشیم. چون باید در هر خانه از صفر تا نُه (اعداد یک رقمی) مقداردهی کنیم پس در نهایت میتونیم برای هر یک از دو خانه باقیمانده 10 رقم رو (از صفر تا 9) مقداردهی کنیم. طبق اصل ضرب داریم:
10 حالت × 10 حالت × 1 حالت × 1 حالت = 100 حـالت
پس ما 100 حالت فقط برای چهار رقم سال تولد کاربرها داریم. به وضوح دیدیم که یک شناسه ای که اصطلاحاً ساختار خاصی داره و یکسری ارقامش بر یک مبنای خاصی هستن از دو قسمت شرطی و غیر شرطی تشکیل شده. توی مثالی که مطرح کردیم قسمت شرطی ماجرا همینطور که گفتیم همون ارقام سال تولد بود و غیر از اون قرار نبود که سایر ارقام شناسه عددی 9 رقمی رو براشون شرط خاصی اعمال کنیم. پس سایر ارقامی که باقی میمونن به بخش غیر شرطی مربوط میشن که تعداد حالات مربوط به این بخش از همون فرمول (رابطه) ده به توان n-1 که قبلتر مطرح کردیم قابل محاسبه است. توی مثال بالا به غیر از چهار رقم سال تولد با احتساب رقم پیگیری همچنان 5 رقم توی میدون هستن. پس طبق رابطه میتونیم 10 به توان 4 (1-5) یا به عبارتی 10 هزار حالت هم از این قسمت (بخش غیر شرطی) داشته باشیم. در نهایت برای اینکه تعداد نهایی حالات رو محاسبه کنیم باید تمامی حالاتی که مربوط به بخش یا بخش های شرطی میشن رو در هم ضرب کنیم و حاصلش رو در بخش غیر شرطی دوباره ضرب کنیم. پس همیشه لزومی نیست که یک شرط داشته باشیم. ما در اینجا فقط ارقام سال تولد رو به عنوان شرط به رسمیت پذیرفتیم ولی گاهی اوقات ممکنه بخوایم بیشتر از یک شرط داشته باشیم که مسئله ای نیست فقط همونطور که گفتیم باید حواسمون باشه که حالات مربوط به هر یک از شروط رو در هم ضرب کنیم و حاصل به دست اومده رو در قسمت غیر شرطی ضرب کنیم. با این توضیحات در نهایت میتونیم 100 × 10,000 = 1000000 (یک میلیون) شناسه عددی ایجاد کنیم.
نحوه ایجاد شناسه های عددی:
بعد از تعیین سیاست گذاری مون وقتشه که شناسه های عددی رو ایجاد کنیم. همینطور که قبلتر هم گفتیم از بین n رقم یک شناسه عددی ما تنها نسبت به n-1 رقم اشراف داریم و رقم n اُم خروجی هست که الگوریتم لان محاسبه میکنه. ما میتونیم این n-1 رقم رو توالی از اعداد تصادفی (رندوم) و یا هر چیزی در نظر بگیریم که توی قسمت سیاست گذاری مفصلاً بحث کردیم. فرض کنیم قصد داریم یک شناسه عددی شش رقمی (n = 6) ایجاد کنیم. برای این منظور باید مراحل زیر رو دنبال کنیم:
[تصویر:  Picture4.png]
نحوه اعتبارسنجی شناسه های عددی:
پروسه اعتبارسنجی کاملاً مشابه پروسه ساختن شناسه هاست منتهی با این تفاوت که رقم پیگیری توی محاسباتمون مجهول نیست و برای خودش مقداری داره. ما رقم پیگیری (اولین رقم از سمت راست) رو در محاسبات اعتبارسنجی دقیقاً مشابه محاسبات ایجاد شناسه تأثیر نمیدیم و بعد از پایان محاسبات تنها چک میکنیم که چیزی که ما به دست آوردیم برابر با رقم پیگیری توی شناسه هست یا خیر. به طور مثال توی نمونه زیر قصد داریم شناسه 82301 که دارای 5 رقم (n = 5) هست رو اعتبارسنجی کنیم.
[تصویر:  Picture5.png]
پیاده سازی نـحـوه ایجاد و اعتبارسنجی شناسه های عددی در کانستراکت:
ایجاد شناسه هـا:
[تصویر:  Picture6.png]
اعتبارسنجی شناسه هـا:

[تصویر:  Picture7.png]
برای ایجاد شناسه ها یک تابع به نام Luhn_Generator() تعریف کردم کـه با توجه به عددی که در تکست باکس وارد میشه یک شناسه عددی تصادفی (رندوم) به همون میزان رقم تولید میکنه.
برای اعتبارسنجی شناسه ها یک تابع به نام Validate_Luhn() تعریف کردم که شناسه هایی که در تکست باکس وارد شدن رو اعتبارسنجی میکنه و راجع به معتبر یا نامعتبر بودنشون اظهار نظر میکنه.
در پایان امیدوارم این مطلب براتون مفید واقع شده باشه.
خوشحال میشم نظراتتون و یا نقاط ابهام این نوشته رو در ادامه به بنده گوشزد کنین.
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط: mostafanastary ، mhp ، ᔕinaᗪehghani ، M.gh ، oak ، hasansanaei
#2

 سلام
من قبلا(همین یک ماه پیش) یک خروجی از فونگپ گرفتم و کار کرد!
ولی دیروز که خواستم خروجی بگیرم خروجی نداد!
وقتی فایل زیپ پروژه ام رو وارد کردم اصلا فایل زیپ اپلود نشد و اخطار داد که اتصال قطع شده است!

این مشکل از خود فونگپ هست که دیگه خروجی نمیده یا مشول از منه؟!
  پاسخ


 سپاس شده توسط:
#3
:/
اروری که دریافت می‌کنید رو در یک تاپیک ( موضوع ) جداگانه مطرح کنید تا به جواب برسید
  پاسخ


 سپاس شده توسط:
#4
چی جوری تاپیک جدید بسازم؟
بلد نیستم میشه کمکم کنید!؟
  پاسخ


 سپاس شده توسط:
#5
به دسته بندی مورد نظر برین و دکمه ی موضوع جدید رو بزنید
  پاسخ


 سپاس شده توسط:


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,460 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,598 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: