Как я могу подтвердить номер социального страхования США? - PullRequest
34 голосов
/ 04 октября 2009

Кто-нибудь знает, как улучшить эту функцию? Я не беспокоюсь о сокращении кода, я уверен, что это можно сделать с помощью лучшего регулярного выражения, меня больше заботит правильная логика. Я ужасно долго находил документацию для SSN #. Большинство правил, которые я использую ниже, пришли от других программистов, которые работают в кредитной индустрии (источники не цитируются).

  1. Существуют ли дополнительные правила, которые ты в курсе?
  2. Знаете ли вы, если что-то из этого не так?
  3. Можете ли вы разместить свои источники?

Спасибо за понимание!

    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;
    }

Ответы [ 8 ]

25 голосов
/ 04 октября 2009

UPDATE

25 июня 2011 года SSA изменило процесс назначения SSN на «рандомизацию SSN». [27] Рандомизация SSN влияет на процесс назначения SSN следующими способами:

Устраняет географическое значение первых трех цифр номера SSN, ранее называемого номером зоны, за счет того, что больше не назначаются номера зон для присвоения отдельным лицам в определенных штатах. Это исключает значимость самого высокого номера группы, и, как следствие, высокий список групп замораживается во времени и может использоваться для проверки SSN, выпущенных до даты реализации рандомизации. Ранее присвоенные номера зон были введены для присвоения, исключая номера зон 000, 666 и 900–999.

Новые правила

  • Номер социального страхования - это девятизначный номер в формате «AAA-GG-SSSS». Номер делится на три части.
  • Две средние цифры - это номер группы. Номера групп варьируются от 01 до 99.
  • Последние четыре цифры являются серийными номерами. Они представляют собой прямую числовую последовательность цифр от 0001 до 9999 внутри группы.
  • Некоторые специальные номера никогда не назначаются:
    • Числа со всеми нулями в любой группе цифр (000 - ## - ####, ### - 00 - ####, ### - ## - 0000).
    • Номера с номерами 666 или 900-999 (индивидуальный идентификационный номер налогоплательщика) в первой группе цифр.
  • SSN , используемые в рекламе , сделали эти номера недействительными.

http://en.wikipedia.org/wiki/Social_Security_number#Structure

Предыдущий ответ

Вот наиболее полное описание состава SSN, которое я нашел.

17 голосов
/ 22 августа 2013

По состоянию на 2011 год SSN полностью рандомизированы (http://www.socialsecurity.gov/employer/randomization.html)

Остались только настоящие правила:

  • Не может начинаться с 900-999 (хотя индивидуальный идентификационный номер налогоплательщика, который может использоваться как временный резидент в качестве SSN и иммигрантами без документов / DACA / DAPA в некоторых ситуациях, имеет тот же формат и начинается с 9)
  • Невозможно начать с 666
  • Невозможно начать с 000
  • Должно быть 9 цифр или 11 с двумя штрихами
  • Не может быть ни одной из известных подделок;
    • "078051120" & mdash; Woolworth Wallet Fiasco
    • "219099999" & mdash; Был использован в объявлении Администрацией социального обеспечения
  • Многие люди также исключают повторение последовательных чисел, хотя теперь они технически действительны, и мне жаль тех бедняжек, которым это присвоено.
15 голосов
/ 27 января 2015

Ответ через 5 лет после первоначального вопроса из-за изменений в правилах проверки Администрацией социального обеспечения 1002 *. Также есть Определенные числа, чтобы сделать недействительными согласно этой ссылке .

В соответствии с моим почти 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 &&
    // basic regex
    ssn.match(/^[0-8]{1}[0-9]{2}[0-9]{2}[0-9]{4}/) &&
    // disallow Satan's minions from becoming residents of the US
    area !== 666 &&
    // it's not triple nil
    area !== 0 &&
    // fun fact: some idiot boss put his secretary's 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'
  );
}

Согласно обновленной информации, другие проверки не выполняются.

11 голосов
/ 04 октября 2009
2 голосов
/ 02 мая 2013

Это, очевидно, старый пост, но я нашел несколько способов его укоротить. Также есть несколько конкретных номеров для аннулирования по этой ссылке: http://www.snopes.com/business/taxes/woolworth.asp

Вот как я это сделал. Я мог бы использовать регулярные выражения для повторяющихся чисел, но с определенными для аннулирования мы могли бы также добавить в этот список от пяти до пятых (более 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's ssn in wallets he sold,
                            // now this is 40000 people's ssn
        ssn=='219099999' || // was used in an ad by the Social Security
                            // Administration
        ssn=='123456789' || // although valid it's 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;
}
1 голос
/ 23 ноября 2016

Я знаю, что это старый вопрос, но ради других, ищущих ответы, я решил добавить быструю функцию 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's 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)

второй раздел гарантирует, что двузначная часть не будет 00

^ ([0-8] [0-9] [0-9] 00)

Третий раздел гарантирует, что последняя часть не 0000

^ ([0-8] [0-9] [0-9] [0-9] [0-9] 0000)

Мы дополнительно проверяем, что они ввели число, и что они не просто используют повторный номер.

1 голос
/ 26 января 2015

Начиная с рандомизации номеров социального страхования после 911, записи в сериях 900 и даже 666 теперь являются потенциально действительными числами.

Единственными определенными вещами в данный момент времени являются:
первая группа из 3 никогда не будет 000
пара средней группы никогда не будет 00
и последние четыре никогда не будут 0000

Вы можете выполнить некоторое тестирование, сначала проверив, чтобы убедиться, что числовое значение записи> = 1010001 [и <1000000000] (ssan 001-01-0001, кажется, является самым низким допустимым назначенным значением). Затем вы можете приступить к проверке 00 в позициях 4 и 5 и 0000 в последних четырех. </p>

0 голосов
/ 18 сентября 2016

Вот моя версия 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...