Вернуться в блог

Правила генерации СНИЛС

Правила генерации СНИЛС

СНИЛС (Страховой номер индивидуального лицевого счёта) — уникальный идентификатор, используемый в России для учёта граждан в системе обязательного пенсионного страхования. Несмотря на то, что номер состоит из 11 цифр, генерация его случайным образом не всегда является корректным подходом. Давайте разберёмся, почему так, и как избежать ошибок при генерации.

Структура и алгоритм формирования СНИЛС

СНИЛС имеет следующий формат: XXX-XXX-XXX YY, где:

  • XXX-XXX-XXX — уникальный номер, состоящий из девяти цифр,
  • YY — контрольное число, вычисляемое по специальному алгоритму.

Алгоритм расчёта контрольного числа:

  1. Каждая цифра номера умножается на свой порядковый номер, начиная с 9 и заканчивая 1.
  2. Полученные произведения суммируются.
  3. Если сумма меньше 100, то она используется в качестве контрольного числа.
  4. Если сумма равна 100 или 101, то контрольное число устанавливается в 00.
  5. Если сумма больше 101, то вычисляется остаток от деления на 101. Если остаток равен 100, контрольное число также принимается равным 00.

Пример расчёта: Допустим, у нас есть номер 123-456-789. Вычислим сумму произведений:

1×9 + 2×8 + 3×7 + 4×6 + 5×5 + 6×4 + 7×3 + 8×2 + 9×1 = 165

Так как сумма больше 101, находим остаток 165 % 101 = 64. Значит, контрольное число — 64, и итоговый СНИЛС: 123-456-789 64.

Почему нельзя просто использовать случайные числа?

Если просто сгенерировать 9 случайных цифр и добавить любые 2 контрольные, то:

  • Такой номер может не соответствовать алгоритму расчёта, а значит, быть некорректным.
  • Существует вероятность дублирования.
  • Некоторые сервисы могут проверять валидность номера перед принятием данных.

Поэтому важно не просто случайно выбирать числа, а учитывать алгоритм расчёта контрольного числа.

Реализация генерации корректного СНИЛС

Вот пример кода на Python, который генерирует валидные номера:

import random

def calculate_checksum(snils_base):
    weights = list(range(9, 0, -1))
    total = sum(int(digit) * weight for digit, weight in zip(snils_base, weights))
    if total < 100:
        return f"{total:02}"
    elif total in [100, 101]:
        return "00"
    else:
        return f"{total % 101:02}" if total % 101 != 100 else "00"

def generate_snils():
    snils_base = f"{random.randint(0, 999999999):09}"
    checksum = calculate_checksum(snils_base)
    return f"{snils_base[:3]}-{snils_base[3:6]}-{snils_base[6:]} {checksum}"

print(generate_snils())

Этот код:

  • Генерирует 9 случайных цифр.
  • Вычисляет контрольное число по алгоритму.
  • Формирует корректный СНИЛС в нужном формате.

Простая генерация случайных чисел не подходит для СНИЛС, так как нарушается логика расчёта контрольного числа. Использование правильного алгоритма позволяет создавать корректные номера, что особенно важно при тестировании.

Если вам нужен сервис генерации СНИЛС онлайн, попробуй использовать наш генератор СНИЛС — мы учитываем все правила и выдаём корректные номера!