Меню

Длина идентификационного номера: почему её нельзя зашивать в код

Длина идентификационного номера различается от страны к стране: где-то девять цифр, где-то буквы и цифры вместе с контрольными знаками. Разбираем, почему единого правила нет и что это значит для проверок.

Опубликовано

  • номера документов
  • тестовые данные
  • валидация

Длина идентификационного номера — первое, за что хватается проверка формы, и первое, на чём она ошибается. Универсального числа не существует: системы нумерации появлялись в разных странах в разное время и решали разные задачи, поэтому один номер укладывается в несколько цифр, а другой занимает больше десятка знаков и включает буквы. Ниже разберём, почему так вышло, чем номера различаются помимо длины и как построить проверку, которая не сломается на первой же незнакомой стране.

Почему единого стандарта не существует

Национальные номера выросли из местных реестров: где-то это налоговая служба, где-то перепись населения, где-то социальное страхование или регистр жителей. Международные стандарты описывают коды стран, регионов, валют и языков, но единого всемирного формата личного номера нет и никогда не было.

Разные источники означают разные правила. Номер, выданный налоговой службой, и номер из регистра жителей могут отличаться не только длиной, но и смыслом: один подтверждает обязанность платить налоги, другой фиксирует факт проживания. Для формы это означает, что подпись поля должна быть точнее слова «номер»: человеку важно понимать, какой именно идентификатор от него ждут, иначе он вставит не то значение, и никакая проверка длины его не спасёт.

Отсюда широкий разброс. Номер может быть чисто цифровым, а может смешивать буквы и цифры. Он может быть коротким или длинным. Из подтверждённых примеров: американский номер социального страхования состоит из девяти цифр; бразильский налоговый номер физлица — из одиннадцати, причём две последние цифры контрольные; канадский номер социального страхования — тоже из девяти цифр. Все остальные страны придётся описывать общими словами: у большинства длина где-то между коротким и длинным значением, и запоминать конкретные числа для каждой страны бессмысленно — их слишком много и они меняются.

Чем ещё различаются номера, кроме длины

Длина — самая заметная, но далеко не единственная характеристика. Если смотреть на номер как на строку, различаются сразу несколько свойств.

Свойство Каким бывает Почему это важно для формы
Набор символов только цифры или цифры с буквами поле с числовым вводом отбросит буквы
Контрольные знаки один, два или ни одного от них зависит, можно ли ловить опечатки
Дата внутри номера есть или нет из номера нельзя автоматически выводить возраст
Разделители пробелы, дефисы или ничего оформление не должно попадать в хранимое значение
Алфавит букв ограниченный или полный часть букв специально исключают как похожие на цифры

Взвешенная сумма с остатком от деления — распространённый способ вычисления контрольного знака. Такой знак обнаруживает опечатку и перестановку соседних символов, но не доказывает, что человек существует. Это ограничение стоит держать в голове и при проектировании сообщений об ошибках: «номер не найден» и «номер введён с ошибкой» — разные утверждения.

Может ли одна страна иметь несколько форматов?

Да, и это встречается чаще, чем ожидают. Номер, выданный двадцать лет назад, обычно остаётся действительным для своего владельца, даже если правила выдачи с тех пор изменились. Налоговый номер и номер регистра жителей могут сосуществовать как два разных идентификатора одной и той же страны. Иностранец или временный резидент иногда получает значение другой формы, чем постоянный житель.

Практический вывод простой: привязывать проверку к одному шаблону на страну рискованно. Правильнее держать для страны список допустимых форм и обновлять его, когда меняются правила, а не переписывать регулярное выражение целиком.

Что будет, если зашить длину в код?

Жёстко заданная длина даёт два вида ошибок, и второй опаснее первого. Первый — ложный отказ: форма отвергает корректный номер, потому что он не совпал с числом, которое кто-то когда-то вписал в проверку. Второй — ложное согласие: значение нужной длины проходит дальше, хотя не имеет никакого смысла, а иногда и вовсе обрезается или дополняется нулями при сохранении.

Особенно неприятна молчаливая нормализация. Если поле обрабатывается как число, ведущие нули исчезают, а если значения приводятся к фиксированной длине, лишние символы отбрасываются без предупреждения. Запись при этом выглядит правдоподобно, и найти причину расхождения потом очень трудно.

Ещё одна привычка, которая обходится дорого, — проверять значение до того, как из него убраны оформительские знаки. Пробелы, дефисы и точки, которые человек расставил для читаемости, не должны попадать в сохраняемое значение, но отклонять из-за них ввод нельзя. Сначала приведите строку к каноническому виду, и только потом применяйте правила страны: так разделители перестанут быть ошибкой, а значение останется чистым.

Как получить номер нужного формата

В генераторе данных личности выберите страну или регион — и вместе с именем, датой рождения и адресом получите номер документа в формате этой страны. Поля берутся из одной записи, поэтому номер не окажется от одной страны, а телефон от другой. Для России, например, отдельно показано, как выглядят поддерживаемые данные.

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

Что важно разработчику: длина, набор символов и запасной путь

Первое правило — не хранить длину как константу. Держите для каждой страны правило, а рядом — ветку для случая «формат неизвестен». Эта ветка должна не отклонять значение, а принимать его и сохранять без изменений: лучше пропустить незнакомый формат, чем потерять данные пользователя.

Второе — переключать проверку по стране выдачи, а не по одному глобальному шаблону. Смешанная проверка, которая подходит всем сразу, обычно не подходит никому: она либо слишком строгая, либо пропускает всё.

Отдельная ловушка — приведение к верхнему регистру «на всякий случай». Если буквы в номере зависят от регистра, такое преобразование незаметно меняет значение и делает запись недействительной. Если не зависят — преобразование безвредно, но полагаться на осторожность хуже, чем знать правило конкретной страны.

Третье — не путать контрольный знак с подтверждением личности. Там, где алгоритм опубликован, его стоит реализовать и проверять; там, где публикации нет, честнее помечать значение как соответствующее формату, а не делать вид, что оно проверено. Об этом же говорит разбор формата американского номера: даже у номера с жёсткой структурой проверка сообщает о записи, а не о человеке.

Четвёртое — подготовить тестовые случаи: слишком короткое значение, верная длина с буквами там, где ожидаются цифры, значение с контрольным знаком, посчитанным неверно, и значение, внутри которого закодирована дата. Последний случай связан с отдельной темой: если номер содержит дату рождения, из него легко вывести возраст, и о границах такого вывода рассказано в статье про крайние случаи даты рождения.

Что делать дальше

Возьмите свою форму и проверьте, как она ведёт себя на стране, для которой вы её не проектировали: чаще всего именно там обнаруживается, что поле рассчитано на один конкретный формат. Для набора примеров сгенерируйте записи в генераторе и добавьте к ним ветку «формат неизвестен» в проверку.

Читать дальше

Статьи: Генератор данных личности и тестовых данных онлайн