web-dev-qa-db-ja.com

米国の社会保障番号を確認するにはどうすればよいですか?

誰もがこの機能を改善する方法を知っていますか?私はコードを短くすることを心配していません。より良い正規表現でこれを行うことができると確信しています。正しいロジックをもっと心配しています。 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;
    }
34
J.Hendrix

[〜#〜] update [〜#〜]

2011年6月25日に、SSAはSSN割り当てプロセスを「SSNランダム化」に変更しました。[27] SSNのランダム化は、次の方法でSSN割り当てプロセスに影響します。

特定の州の個人への割り当てにエリア番号を割り当てないことにより、以前はエリア番号と呼ばれていたSSNの最初の3桁の地理的重要性を排除します。最高のグループ番号の重要性を排除し、その結果、高グループリストは時間内に凍結され、ランダム化の実施日より前に発行されたSSNの検証に使用できます。以前は割り当てられていなかったエリア番号が、エリア番号000、666、900〜999を除く割り当てに導入されました。

新しいルール

  • 社会保障番号は、「AAA-GG-SSSS」形式の9桁の数字です。番号は3つの部分に分かれています。
  • 中央の2桁はグループ番号です。グループ番号の範囲は01〜99です。
  • 最後の4桁はシリアル番号です。それらは、グループ内の0001から9999までのまっすぐな数字列を表します。
  • 一部の特別な番号は割り当てられません:
    • 任意の数字グループにすべてゼロの数字(000-##-####、###-00-####、###-##-0000)。
    • 最初の数字グループにある666または900-999(個人納税者識別番号)の番号。
  • SSN 広告で使用 はこれらの番号を無効にしました。

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

前の回答

これが、私が見つけたSSNの構成の most-complete description です。

25
Eric J.

2011年現在、SSNは完全にランダム化されています( http://www.socialsecurity.gov/employer/randomization.html

残っている実際のルールは次のとおりです。

  • 900〜999で開始することはできません(ただし、一時的な居住者や状況によっては文書化されていない/ DACA/DAPA移民がSSNのように使用できる個人納税者識別番号は同じ形式で、9で始まります)
  • 666で開始できません
  • 000で始めることはできません
  • 9桁の数字または2つのダッシュ付きの11桁でなければなりません
  • 既知の偽物であってはなりません;
    • "078051120" —ウールワースウォレットフィアスコ
    • 「219099999」—社会保障局による広告で使用された
  • 多くの人は連続番号の繰り返しも除外していますが、これらは現在技術的に有効であり、これらを割り当てられた貧しいシュマックさんには申し訳ありません。
18
Louis

社会保障局 による検証ルールの変更により、最初の質問から5年後に回答します。また、この link に従って無効化する特定の番号があります。

私のほぼ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'
  );
}

更新された情報によると、実行する他のチェックはありません。

15
MaKR

すべては socialsecurity.gov にあります: 番号付け方式割り当て最高の番号 は毎月更新されます。

11
Zed

これは明らかに古い投稿ですが、短縮する方法をいくつか見つけました。また、このリンクによると、無効にする特定の番号がいくつかあります。 http://www.snopes.com/business/taxes/woolworth.asp

ここに私がそれをした方法があります。繰り返し番号に正規表現を使用することもできましたが、無効にする特定の正規表現を使用して、5から1をそのリストに追加することもできます(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
MaKR

これは古い質問ですが、答えを探している他の人のために、特定のSSNが有効であることを確認するための簡単なjavascript関数を追加することを考えました。

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の1つである場合に処理します。

^(9 [0-9] [0-9] | 666 | 000 | 078051120 | 219099999 | 123456789 | 123121234 | 321214321)

2番目のセクションは、2桁の部分が00でないことを保証します

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

3番目のセクションでは、最後の部分が0000でないことを確認します

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

さらに、ユーザーが数字を入力したこと、および繰り返し数字を使用しているだけではないことを確認します。

1
GuyThreepwood64

ここに私の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;
}
0
Jesse Szypulski

911以降の社会保障番号のランダム化の時点で、900シリーズと666のエントリも有効な番号になる可能性があります。

この時点で特定の唯一のものは次のように見えます:
3の最初のグループは000になることはありません
ミドルグループペアは00にはなりません。
最後の4つは0000にはなりません

エントリの数値が1010001以上(1000000000以下)であることを確認するために、最初にテストすることにより、いくつかのテストを実行できます(001-01-0001のssanが正当に割り当てられた最も低いようです)。次に、位置4と5の00と最後の4つの0000のチェックに進むことができます。

0
2kmaro