Встретил у Болка запись о том, как формируются номера российских ИНН. Стало интересно, как с этим обстоит дело у нас.
Итак, украинский ИНН (индивидуальный налоговый номер) состоит из 10 цифр. В нём зашифрованы:
- дата рождения (первые пять цифр образуют число, равное количеству дней от 01.01.1900 до даты рождения владельца ИНН);
- пол (чётность девятой цифры: четная цифра – женский, нечетная – мужской);
- checksum, т.е. контрольное число (последняя цифра)
Как считается контрольная цифра я пока что не знаю. Здесь можно проверить, как работает большой брат, исходники большого брата — под катом.
Забавные факты про украинский ИНН:
- физическим лицам, которые из-за своих религиозных или других убеждений отказываются от принятия идентификационного номера, официально сообщили об этом соответствующим органам государственной власти и имеют соответствующую отметку в паспорте, предоставляется идентификационный номер в виде номера и серии паспорта таких лиц (src);
- иностранцы не могут отказаться от кодов, даже если они имеют соответствующие религиозные убеждения. Причина: украинские власти не могут внести соответствующую отметку в их паспорт (см. предыдущий пункт) и присвоить ИНН по номеру паспорта. Зачем нужен украинский ИНН иностранцу? Чтобы иметь возможность стать учредителем юрлица или заниматься предпринимательской деятельностью на территории Украины (src);
- я не смог найти в сети информацию о том, какие ИНН присваиваются гражданам, родившимся в 19 веке (т.е. до 01.01.1900 года).
Отдельно хочется процитировать каких-то религиозных маразматиков (орфография и пунктуация сохранены):
Как здесь не заметить, что определенные проблемы будут ощущать, например, лица, которые изменили свой пол.
Понятно, что не сложно написать программу, которая к 1 января 1900 года прибавит число и получит дату рождения. Так что, милые дамы, со старинным правилом этикета, согласно которого о Вашем возрасте спрашивать было не принято, придется расстаться. У технотронного века свой жесткий и далекий от условностей приличия “этикет”.
Мой вам совет, милые дамы: если кто-то выспрашивает у вас ваш ИНН, отнеситесь к нему с подозрением!
/* developed by студия webous
http://dev.zp.ua/
author: val petruchek
e-mail: petruchek, собака, gmail.com
date: October 29, 2007 */
function ParseUaID($id)
{
//$id must contain 10 digits
if (!preg_match(‘/^\d{10}$/’,$id) || ($id==0))
return false;
$result = array();
//sex
$result[’sex’] = (substr($id,8,1) % 2) ? ‘M’ : ‘F’;
//birthdate
$days = substr($id,0,5);
$year = 1900; $day = 01; $month = 01;
while ($days > 0)
{
$daysInYear = (checkdate (02, 29, $year)) ? 366 : 365;
if ($days > $daysInYear)
{
$days -= $daysInYear;
$year ++;
}
else{
for ($daysInMonth = 31; !checkdate($month, $daysInMonth, $year); $daysInMonth–) ;
if ($days > $daysInMonth)
{
$days -= $daysInMonth;
$month ++;
}
else{
$day = $days;
$days = 0;
}
}
}
$result[‘year’] = $year;
$result[‘month’] = $month;
$result[‘day’] = $day;
return $result;
}

1. В регулярном выражении нехватает слеша перед «d».
2. Проверку на нулевой id можно делать так: !$id
3. Нечётность надо проверять вот так: $var & 1, нахождение остатка от деления — плохой способ
4. Найти количество дней в месяце можно вызовом date(’t', $timestamp)
…хватит, думаю
Comment by BOLK — 29.10.2007 @ 14:58
Bolk,
1. WordPress съел, я что-то сразу не догадался глянуть, на каком именно этапе он потерялся.
2. Можно так, а можно и не так. Дело вкуса.
3. Почему плохой? Дело вкуса.
4. Windows does not support dates prior to midnight (00:00:00), January 1, 1970 — соответственно вызов $days = date(’t', mktime(0,0,0,2,1,1940)); будет работать не везде, ага.
Comment by Val Petruchek — 29.10.2007 @ 17:47
BTW, Bolk, у тебя старые ссылки не работают, что не очень правильно при апгрейде движка.
Comment by Val Petruchek — 29.10.2007 @ 18:00
Там ещё информация есть - одна или две цифры - какой ты по порядку человек, родившийся в тот же день
То есть если уже есть 4 ИНН у которых пять первых цифр совпадают - то одна из цифр в ИНН будет 5 (а у тех четырёх соответственно 1-4)
Comment by Vanger — 30.10.2007 @ 10:59
Vanger: на это отведены три с половиной цифры (с шестую по девятую). При этом девятая заодно хранит информацию о поле.
Дело в том, что налоговой не под силу узнать “какой я по порядку человек, родившийся в этот день”, так что эти цифры каким-то образом меня уникально идентифицируют среди тех, кто родился со мной в один день.
Код рассчитан под максимум 5000 мальчиков и 5000 девочек, родившихся в один день.
Comment by Val Petruchek — 30.10.2007 @ 12:19
“какой я по порядку человек, родившийся в этот день”,
все достаточно прозаично, в порядке регистрации в налоговой,
т.е кто раньше получил код у того номер и меньше.
Comment by ESL — 14.03.2008 @ 09:23
ESL, получается “кто раньше встал, того и тапки”.
Спасибо.
Comment by Val Petruchek — 14.03.2008 @ 09:59
Funny enough, я нашел этот пост в поисках информации по работе и он оказался мне полезен!
Comment by zorgg — 09.02.2009 @ 14:45
OMG ZORGG IS READING MY BLOGG!!1
Comment by Val Petruchek — 09.02.2009 @ 14:50
На самом деле в украинских ИНН бывают осечки с полом
(т.е. ИНН муж. принадлежал жен. и наоборот).
В моей практике
peooc.donntu.edu.ua/aladin/
таких случаев было примерно 2 на 130 человек.
Это значит, что 100% эта расшифровка не работает
и есть исключения.
Кроме того различного рода программы выпускаемые налоговой и пенсионным фондом не используют этот алгоритм проверки. По всей видимости по той же причине.
Comment by don_alessandro — 17.02.2009 @ 09:13
don_alessandro, это всего лишь осечки, которые не мешают пользоваться системой.
Например: по вводимому ИНН автоматически предзаполнять поля с датой рождения и полом, которые потом верифицировать и менять в случае несовпадения.
Comment by Val Petruchek — 21.02.2009 @ 05:10
Откуда 5000 ???
первые 5 цифр одинаковые у всех людей с одинаковой датой рождения
девятая цифра среди них одинаковая среди мальчиков и девочек
десятая одинаковая у всех, у кого одинаковые первые девять, остается три цифры - шестая, седьмая и восьмая, это 999 комбинаций в пределах одних суток
Comment by gusto — 03.04.2009 @ 23:42
Gusto, (с)читать научитесь.
Чётность девятой цифры определяет пол, она необязательно совпадает для всех мальчиков.
“десятая одинаковая у всех, у кого одинаковые первые девять” — эту гениальную идею я даже комментировать не буду, перечитывайте её до просветления.
Очевидно, что раз десятая цифра — это контрольная, то она не содержит новой информации, а валидирует предыдущие девять цифр.
Первые пять — дата рождения.
6,7,8,9 - порядковый номер среди родившихся в один день и пол. Всего 10000 вариантов. Половина (5000) — чётные (мальчики), вторая половина (5000) — нечётные (девочки).
Даже как-то неудобно такие очевидности писать.
С уважением, ваш Капитан.
Comment by Val Petruchek — 04.04.2009 @ 08:50
Кстати, если интересно, то вот вам формула расчета контрольной (10-ой) цифры:
код:АБВГДЕЖЗИК
Х = А*(-1) + Б*5 + В*7 + Г*9 + Д*4 + Е*6 + Ж*10 + З*5 + И*7
К= Х-(11 * целая часть(Х/11))
Comment by Tranzit — 25.05.2009 @ 18:34
К= Х-(11 * целая часть(Х/11))
В excele это пишется формулой: ОСТАТ(X;11)
В иных прогах - MOD(X;11)
Comment by Tranzit — 25.05.2009 @ 18:38
Спасибо!
Comment by brag — 23.10.2009 @ 01:24
К= Х-(11 * целая часть(Х/11)) = ОСТАТ(X;11) = MOD(X;11):
Возвратит значение от 0 до 10(!)
Есть подозрение что нужно еще раз взять остаток по модулю 10 чтобы получить выборку от 0 до 9
Но все-таки интересно: у кого есть доступ к большой базе кодов - проверить базовый алгоритм на всех - может этот вариант (когда остаток деления на 11 дает 10) исключается “правильным” подбором цифр с 6 по 9 ? Но тогда к-во рожденных мальчиков/девочек в один день будет меньше 5000
Comment by Kivals — 13.11.2009 @ 23:36
Стало интересно - проверил на 440 ИНН:
4 не сошлась контрольная цифра (большая вероятность что неправильно внесли)
Остальные вернули остаток от деления на 11 от 1(!) до 10, т.е. нацело не поделилась ни одна “контрольная сумма”.
(остаток 10 пришелся на 47 записей - т.е. практически 10% - вполне раномерное распределение)
Comment by Kivals — 14.11.2009 @ 03:57
лица отказавшиеся от ИНН получают код 000000000 (9 нулей), вариант с серией/номером паспорта не встречал, хотя выборка огромная
Comment by yl — 25.11.2009 @ 13:12
За формулу - СПАСИБО!! 33 года искал
Comment by slawko — 20.01.2010 @ 16:22
“лица отказавшиеся от ИНН получают код 000000000 (9 нулей)”
Сам смысл ИНН - в его уникальности. Если все получают одинаковый код - смысл потерян.
Хотя в законе ничего не сказано про получение ИНН лицами, которые от него отказались: http://zakon.rada.gov.ua/cgi-bin/laws/main.cgi?nreg=320%2F94-%E2%F0
Но в том же законе написано, что должна проставляться соответствующая отметка в паспорте (про отказ от ИНН), так что для внесения такого физ.лица в систему учета вариант с паспортом более правдоподобен.
Comment by Kivals — 09.02.2010 @ 16:03
проверка контрольной суммы на пхп
function INN_CSumCCheck($inn){
if(strlen($inn)==10){
$s = $inn[0]*(-1)+$inn[1]*5+$inn[2]*7+$inn[3]*9+$inn[4]*4+$inn[5]*6+$inn[6]*10+$inn[7]*5+$inn[8]*7;
$p=$s/11;
$s-($n*intval($p));
if(mod($sum,11)==$uparam['UF_INN'][9]) return true;
}
return false;
вернёт true в случае верной контрольной суммы и false если ошибка
Comment by Сергей — 04.03.2010 @ 14:06