کد ملی در فرم: چرا فقط «۱۰ رقم» کافی نیست
کد ملی ایرانی رقم کنترلی دارد. اگر فرم شما فقط طول را چک کند، ۹۰٪ کدهای الکی از فیلتر رد میشوند.
بیشتر فرمهای فارسی برای کد ملی فقط طول را چک میکنند: ده رقم؟ قبول. نتیجه این است که «۱۲۳۴۵۶۷۸۹۰» هم رد میشود و میرود توی پایگاهدادهتان.
کد ملی رقم کنترلی دارد
رقم دهم کد ملی تصادفی نیست؛ از روی ۹ رقم اول حساب میشود. الگوریتمش:
- هر رقم از چپ در ضریبی از ۱۰ تا ۲ ضرب میشود (رقم اول در ۱۰، دومی در ۹، …، نهمی در ۲).
- حاصلها جمع میشوند و باقیماندهی تقسیم بر ۱۱ گرفته میشود.
- اگر باقیمانده کمتر از ۲ بود، رقم کنترلی خودِ باقیمانده است؛ وگرنه ۱۱ منهای باقیمانده.
یعنی از هر ۱۰ عدد دهرقمی، تقریباً یکی میتواند کد ملی معتبر باشد. اعتبارسنجی الگوریتمی حدود ۹۰٪ ورودیهای تصادفی را همانجا رد میکند — بدون اینکه به هیچ سرویس بیرونی وصل شوید.
کدهای تکراری که باید رد شوند
یک تله: کدهایی مثل «۱۱۱۱۱۱۱۱۱۱» از نظر الگوریتم بالا معتبر درمیآیند. هر پیادهسازی درستی باید اینها را جداگانه رد کند.
ارقام فارسی هم باید بگیرد
کاربر ایرانی ممکن است با کیبورد فارسی «۰۰۱۲۳۴۵۶۷۸» بنویسد. اگر فرم فقط ارقام لاتین بپذیرد، کاربر خطا میبیند و نمیفهمد چرا — چون از نظر خودش عدد درستی نوشته. فیلد کد ملی باید ارقام فارسی و عربی را خودکار به لاتین تبدیل کند، نه اینکه خطا بدهد.
همین نکته موقع مقایسه هم مهم است: اگر میخواهید هر کد ملی فقط یک بار پاسخ بدهد، «۱۲۳» و «123» باید یک نفر حساب شوند. وگرنه محدودیت با عوضکردن کیبورد دور زده میشود.
صفر ابتدایی را نخورید
کد ملی خیلی از شهرها با صفر شروع میشود. اگر فیلد را «عدد» تعریف کنید، صفرِ اول در اکسل و در پایگاهداده حذف میشود و کد ۹ رقمی میشود. کد ملی متن است نه عدد — حتی اگر فقط رقم داشته باشد.
همین اشتباه سر شماره موبایل و شماره حساب هم رخ میدهد و معمولاً وقتی کشف میشود که دیگر هزار رکورد خراب دارید.
چه وقت اصلاً کد ملی نخواهید
کد ملی دادهی هویتی حساس است. اگر فقط میخواهید «هر نفر یک بار» پاسخ بدهد، کد پرسنلی یا شماره موبایل همان کار را میکند و ریسک کمتری دارد. کد ملی را وقتی بخواهید که واقعاً لازمش دارید — قرارداد، گواهی رسمی، احراز هویت.