Алгоритм проверки СНЛИС во многом походит на
алгоритм проверки ИНН или других регистрационных номеров. Чтобы проверить, правильно ли указан номер, потребуется выполнить несколько действий.
Номер СНИЛС имеет формат вида NNN-NNN-NNN ZZ, где последовательность N - сам номер, а ZZ - контрольное число.
Для проверки соответствия номера контрольному числу выполняются следующие действия:
- каждое число (от 0 до 9) в номере умножается на номер своей позиции, отсчитываемой справа. То есть первое число умножается на 9, второе на 8 и т. д.;
- все произведения суммируются.
Дальше нужно работать с полученной суммой:
- если полученная сумма меньше 100, значит она должна быть равна контрольному числу ZZ;
- если сумма равна 100 или 101, значит контрольное число должно быть 00;
- если сумма больше 101, то нужно разделить её на 101. Остаток снова проверяется по двум вышеописанным пунктам.
Важное уточнение: данный алгоритм работает только для номеров больше 001-001-998.
Алгоритм проверки СНИЛС просто реализовать самостоятельно. В качестве примера можно посмотреть проверку СНИЛС на python.
def check_snils(snils, digits = True):
if len(snils) <> 14:
return False
def snils_csum(snils):
k = range(9, 0, -1)
pairs = zip(k, [int(x) for x in snils.replace('-', '').replace(' ', '')[:-2]])
return sum([k * v for k, v in pairs])
csum = snils_csum(snils)
while csum > 101:
csum %= 101
if csum in (100, 101):
csum = 0
return csum == int(snils[-2:])
upd 02.08.14: исправлена ошибка, когда остаток от деления на 101 равнялся 100, из-за чего контрольное число сравнивалось неверно.
>>если сумма больше 101, то нужно разделить её на 101. Остаток от снова проверяется по двум вышеописанным пунктам. Остаток меньше 100 – должен быть равен контрольному числу, если равен 100 или 101 – контрольное число должно быть 00.
Каким образом остаток от деления на 101 может равняться 101?
Вы правы, моя невнимательность при описании. По аналогии со вторым пунктом продублировал про “100 и 101”, хотя там это относится к сумме, а не к остатку от деления.