Как я могу проверить номер социального страхования в США?
Кто-нибудь знает, как улучшить эту функцию? Я не беспокоюсь о сокращении кода, я уверен, что это может быть сделано с лучшим регулярным выражением, меня больше беспокоит правильная логика. У меня было ужасное время найти документацию для SSN #. Большинство правил, которые я использую ниже, поступают от других программистов, работающих в кредитной индустрии (источники не цитируются).
- Есть ли дополнительные правила, которые
вы знаете?
- Знаете ли вы, что это неправильно?
- Можете ли вы разместить свои источники?
Спасибо за понимание!
public static bool isSSN(string ssn)
{
Regex rxBadSSN = new Regex(@"(\d)\1\1\1\1\1\1\1\1");
//Must be 9 bytes
if(ssn.Trim().Length != 9)
return false;
//Must be numeric
if(!isNumeric(ssn))
return false;
//Must be less than 772999999
if( (Int32)Double.Parse(ssn.Substring(0,3)) > 772 )
{
//Check for Green Card Temp SSN holders
// Could be 900700000
// 900800000
if(ssn.Substring(0,1) != "9")
return false;
if(ssn.Substring(3,1) != "7" && ssn.Substring(3,1) != "8")
return false;
}
//Obviously Fake!
if(ssn == "123456789")
return false;
//Try again!
if(ssn == "123121234")
return false;
//No single group can have all zeros
if(ssn.Substring(0,3) == "000")
return false;
if(ssn.Substring(3,2) == "00")
return false;
if(ssn.Substring(5,4) == "0000")
return false;
//Check to make sure the SSN number is not repeating
if (rxBadSSN.IsMatch(ssn))
return false;
return true;
}
Ответы
Ответ 1
UPDATE
25 июня 2011 года SSA изменил процесс назначения SSN на "рандомизацию SSN" [27]. Рандомизация SSN влияет на процесс назначения SSN следующими способами:
Он устраняет географическое значение первых трех цифр SSN, ранее называемого Area Number, больше не выделяя номера областей для присвоения отдельным лицам в определенных состояниях.
Это исключает значимость наивысшего номера группы, и, как результат, список высоких групп заморожен во времени и может использоваться для проверки SSN, выпущенных до даты реализации рандомизации.
Ранее назначенные номера номеров были введены для присвоения, за исключением номеров номеров 000, 666 и 900-999.
Новые правила
- Номер социального страхования - девятизначное число в формате "AAA-GG-SSSS". Номер делится на три части.
- Средние две цифры - это номер группы. Номера групп варьируются от 01 до 99.
- Последние четыре цифры - это серийные номера. Они представляют собой прямую цифровую последовательность цифр от 0001 до 9999 в пределах группы.
- Некоторые специальные номера никогда не выделяются:
- Числа со всеми нулями в любой группе цифр (000 - ## - ####, ### - 00 - ####, ### - ## - 0000).
- Номера с номером 666 или 900-999 (индивидуальный идентификационный номер налогоплательщика) в первой группе цифр.
- SSNs используемые в рекламе, сделали эти числа недействительными.
http://en.wikipedia.org/wiki/Social_Security_number#Structure
Предыдущий ответ
Здесь наиболее полное описание состава SSN, который я нашел.
Ответ 2
По состоянию на 2011 год SSN полностью рандомизированы (http://www.socialsecurity.gov/employer/randomization.html)
Единственными реальными правилами являются:
- Невозможно начать с 900-999 (хотя идентификационный номер индивидуального налогоплательщика, который может быть использован как SSN временными резидентами и иммигрантами без документов /DACA/DAPA в некоторых ситуациях, находится в одном формате и начинается с 9)
- Невозможно начать с 666
- Невозможно начать с 000
- Должно быть 9 числовых цифр или 11 с двумя штрихами
- Не может быть никаких известных подделок;
- "078051120" — Woolworth Wallet Fiasco
- "219099999" — Был использован в объявлении Администрацией социального обеспечения.
- Многие люди исключают повторение последовательных чисел, хотя они теперь технически обоснованы, и мне жаль бедного чмо, который получает их.
Ответ 3
Все это в socialsecurity.gov: Схема нумерации, распределения, самые высокие числа ежемесячно обновляется.
Ответ 4
Ответьте на 5 лет после первоначального вопроса из-за изменений в правилах проверки с помощью Администрации социального обеспечения. Также есть специальные номера для недействительности в соответствии с этой ссылкой .
В соответствии с моим почти 2-летним ответом я также оставил isNumeric (ssn), потому что поле является числовым и уже разделяет символы перед вызовом функции проверки.
// validate social security number with ssn parameter as string
function validateSSN(ssn) {
// find area number (1st 3 digits, no longer actually signifies area)
var area = parseInt(ssn.substring(0, 3));
return (
// 9 characters
ssn.length === 9 &&
// no set can start with zero
ssn.match(/^[1-9][0-9]{2}[1-9][0-9]{1}[1-9][0-9]{3}/) &&
// disallow Satan minions from becoming residents of the US
area !== 666 &&
// it over 900
area < 900 &&
// fun fact: some idiot boss put his secretary ssn in wallets
// he sold, now it "belongs" to 40000 people
ssn !== '078051120' &&
// was used in an ad by the Social Security Administration
ssn !== '219099999'
);
}
В соответствии с обновленной информацией нет других проверок.
Ответ 5
Это, очевидно, старый пост, но я нашел несколько способов сократить его. Также есть несколько конкретных чисел, которые недействительны в соответствии с этой ссылкой:
http://www.snopes.com/business/taxes/woolworth.asp
Вот как я это сделал. Я мог бы использовать регулярные выражения для повторения чисел, но с конкретными для недействительности мы могли бы также добавить их через fives в этот список (более 5 будет недействительным в любом случае из-за проверки номера области). Я также оставил isNumeric (ssn), потому что поле является числовым и уже разделяет символы перед вызовом функции проверки.
function validateSSN(ssn) {
// validate format (no all zeroes, length 9
if (!ssn.match(/^[1-9][0-9]{2}[1-9][0-9]{1}[1-9][0-9]{3}/)
|| ssn.length!=9) return false;
// validate area number (1st 3 digits)
var area=parseInt(ssn.substring(0, 3));
// standard railroad numbers (pre-1963)
if (area>649 && !(area>=700 && area<=728)) return false;
// disallow specific invalid number
if (ssn=='078051120' || // fun fact: some idiot boss put his
// secretary ssn in wallets he sold,
// now this is 40000 people ssn
ssn=='219099999' || // was used in an ad by the Social Security
// Administration
ssn=='123456789' || // although valid it not yet assigned and
// you're not likely to meet the person who
// will get it
ssn=='123121234' || // probably is assigned to someone but more
// likely to find someone trying to fake a
// number (next is same)
ssn=='321214321' || // all the rest are likely potentially
// valid, but most likely these numbers are
// abused
ssn=='111111111' ||
ssn=='222222222' ||
ssn=='333333333' ||
ssn=='444444444' ||
ssn=='555555555') return false;
return true;
}
Ответ 6
Как и в случае рандомизации номеров социального обеспечения после 911, записи в серии 900 и даже 666 теперь являются потенциально допустимыми числами.
Единственные определенные вещи на данный момент времени:
первая группа из 3 никогда не будет 000
пара средних групп никогда не будет 00
и последние четыре никогда не будут 0000
Вы можете выполнить некоторое тестирование с помощью первого тестирования, чтобы убедиться, что числовое значение записи >= 1010001 [и < 1000000000] (ssan из 001-01-0001 представляется наименее законным). Затем вы можете продолжить проверку на 00 в позициях 4 и 5 и 0000 в последних четырех.
Ответ 7
Я знаю, что это старый вопрос, но ради других, которые ищут ответы, я подумал, что добавлю быструю функцию javascript для проверки того, что данный SSN действителен.
function checkSSN() {
var inputSSN = #YourInput#,
ssnRegex = new RegExp("^(9[0-9][0-9]|666|000|078051120|219099999|123456789|123121234|321214321)|^([0-8][0-9][0-9]00)|^([0-8][0-9][0-9][0-9][0-9]000)$"),
repeats = /^(.)\1+$/;
//make sure we have 2 dashes in the input Social Security number
if( inputSSN.match(/./g).length === 2) {
//Once we have confirmed that there are the right number of dashes, remove them, and make sure that the resulting string is a number (you may or may not need this logic depending on the format of your input SSN.
inputSSN = inputSSN.replace(/-/g, "");
if(!isNaN(inputSSN)) {
//Test the input SSN against our regex to ensure that it doesn't contain any disqualifying combinations.
if(!ssnRegex.test(inputSSN)) {
//Make sure the input SSN isn't just a repeated number
if(!repeats.test(inputSSN)) {
//If it lands inside of this, we know it a valid option for a social security number.
}
}
}
}
Для логики ssnRegex:
Первый раздел обрабатывается, если SSN начинается с номера 900-999, 666, 000 или одного из известных дисквалифицирующих SSN, упомянутых выше.
^ (9 [0-9] [0-9] | 666 | 000 | 078051120 | 219099999 | 123456789 | 123121234 | 321214321)
вторая секция гарантирует, что 2-значная часть не 00
^ ([0-8] [0-9] [0-9] 00)
Третий раздел гарантирует, что последняя часть не 0000
^ ([0-8] [0-9] [0-9] [0-9] [0-9] 0000)
Мы дополнительно проверяем, чтобы они ввели число, и что они не просто используют повторяющееся число.
Ответ 8
Вот моя версия PHP
/**
* Validate SSN - must be in format AAA-GG-SSSS or AAAGGSSSS
*
* @param $ssn
* @return bool
*/
function validate_ssn($ssn) {
$ssnTrimmed = trim($ssn);
// Must be in format AAA-GG-SSSS or AAAGGSSSS
if ( ! preg_match("/^([0-9]{9}|[0-9]{3}-[0-9]{2}-[0-9]{4})$/", $ssnTrimmed)) {
return false;
}
// Split groups into an array
$ssnFormatted = (strlen($ssnTrimmed) == 9) ? preg_replace("/^([0-9]{3})([0-9]{2})([0-9]{4})$/", "$1-$2-$3", $ssnTrimmed) : $ssnTrimmed;
$ssn_array = explode('-', $ssnFormatted);
// number groups must follow these rules:
// * no single group can have all 0's
// * first group cannot be 666, 900-999
// * second group must be 01-99
// * third group must be 0001-9999
foreach ($ssn_array as $group) {
if ($group == 0) {
return false;
}
}
if ($ssn_array[0] == 666 || $ssn_array[0] > 899) {
return false;
}
return true;
}