الگوریتم اعتبارسنجی کدملی
در این نوشته روش تحلیل کدملی ایرانی را بررسی میکنیم و الگوریتم آن را به شما توضیح میدهیم و در انتها یک کد پایتون برای این اعتبارسنجی در اختیار شما قرار میدهیم.
الگوریتم اعتبارسنجی کدملی
تعریف: کدملی یک کد 11 رقمی یکتا است که به هر شخص با ملیت ایرانی داده میشود.

- ناحیه نارنجی (3 رقم): کد شهرستان محل صدور شناسنامه.
- ناحیه زرد (6 رقم): کد منحصر به فردی است که در محل صدور شناسنامه برای هیچ فرد دیگری در نظر گرفته نشده است ولی ممکن است در شهرستان دیگری همین کد برای فرد دیگری استفاده شود.
- ناحیه قرمز (1 رقم): این عدد یک عدد کنترلی هست که با توجه به 9 رقم دیگر قابل محاسبه است.
روش محاسبه عدد کنترلی کدملی
- ابتدا تمام ارقام را با موقعیت آن ضرب میکنیم.
- حاصل ضرب اعداد در موقعیت آنها را با هم جمع میکنیم.
- عدد بدست آمده را تقسیم بر 11 میکنیم.
- اگر باقیماندهی بدست آمده کمتر از 2 باشد باید رقم کنترلی برابر آن باشد در غیراینصورت باید رقم کنترلی برابر 11-باقیمانده است.
نکته: تمام رقمهای عدد کدملی یکسان نمیشود. (مثلا همه ۸)
نکته: اگر در اعتبارسنجی کدملی میخواهید یک فیلد در نظر بگیرید طول کدملی را بین حداقل 8 رقم تا حداکثر 10 رقم در نظر بگیرید زیر کد شهرستان محل صدور اگر تهران باشد معمولا دو رقم سمت چپ ابتدایی کدملی صفر است و گاهی افراد در سیستمها آن را وارد نمیکنند زیرا این فیلد را یک فیلد عددی میبینند و در اصل ریاضیات صفر قبل عدد نیز قابل چشمپوشی است. تعدادی از شهرستانها نیز با یک صفر شروع میشوند.
def validate_iranian_national_code(code):
code_len = len(code)
if code_len > 10 or code_len < 8:
return False
if len(set(code)) == 1:
return False
if len(code) < 10:
code = code.zfill(10)
factors = [10, 9, 8, 7, 6, 5, 4, 3, 2]
checksum = sum(int(code[i]) * factors[i] for i in range(len(code) - 1))
remainder = checksum % 11
last_digit = int(code[-1])
if remainder < 2:
return remainder == last_digit
else:
return 11 - remainder == last_digit
اگر نیاز به آموزش های بیشتری در ارتباط با زبان برنامه نویسی پایتون دارید در بخش نظرات این نوشته برای ما بنویسید.



















میشه این تابع رو به صورت کلاس یا ماژول تبدیل کرد؟
بله، میتوان تابع اعتبارسنجی کدملی را به یک کلاس یا ماژول پایتون تبدیل کرد تا قابلیت استفاده چندباره و سازمانیافته داشته باشد. برای مثال میتوانید یک کلاس NationalCodeValidator بسازید که متدهایی مثل validate و validate_multiple داشته باشد.
استفاده از این الگوریتم توی فرمهای آنلاین ایمن هست؟
این الگوریتم فقط صحت ساختاری کدملی را بررسی میکند و از نظر اعتبارسنجی فرمت درست است. برای امنیت فرمهای آنلاین، بهتر است علاوه بر این الگوریتم، از HTTPS و اعتبارسنجی سمت سرور هم استفاده کنید.
میشه این تابع رو برای بررسی همزمان چند کدملی تغییر داد؟
بله، میتوان یک تابع یا متد جدید ساخت که یک لیست از کدملیها را دریافت کند و خروجی اعتبارسنجی همه آنها را در قالب دیکشنری یا لیست بازگرداند. این روش برای پردازش دستهای بسیار مناسب است.
این الگوریتم تو همه شهرستانها درست کار میکنه؟
بله، الگوریتم اعتبارسنجی ساختار کدملی را بررسی میکند و مستقل از شهرستان است. فقط توجه داشته باشید که کدهای ساختهشده همگی باید قوانین کدملی (تعداد رقم و رقم کنترلی) را رعایت کنند.
این الگوریتم برای کدملی کمتر از ۱۰ رقم هم جواب میده؟
بله، الگوریتم کدهای کمتر از ۱۰ رقم را با اضافه کردن صفرهای سمت چپ کامل میکند و سپس اعتبارسنجی را انجام میدهد. بنابراین کدهای ۸ یا ۹ رقمی هم پشتیبانی میشوند.