2009-10-04 11 views
29

誰もがこの機能を改善する方法を知っていますか?私はコードを短縮することを心配していない、私はこれがより良い正規表現で行うことができると確信している、私はより正確な論理を心配しています。私は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; 
    } 

答えて

20

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(個別の納税者番号)の番号。
  • SSNs used in advertisingこれらの数字は無効です。

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

前の回答は、ここで私が見つけたSSNのメイクのmost-complete descriptionです。

+1

@ user2864740:2011年6月の変更を反映するように答えを更新しました。 –

+0

非常に興味深い。 – Jeffpowrs

+0

すばらしい答え。ありがとうございました。 – catbadger

11

それはsocialsecurity.govですべてです:highest numbersは毎月更新され、Numbering schemeallocations

+2

はい。本質的に、あなたは本当に*米国社会保障番号を検証する*ことはできません。たとえば、チェックデジットはありません。あなたができる最高のことは、明らかに無効なものを投げることです。また、米国社会保障番号の可能な領域は10億の離散値(0-999999999)であることにも留意してください。割り当てスキーマのために実際の領域にギャップがあり、現在米国で生きている人数は3億人を超えており、ほとんどが社会保障番号を持つため、可能な領域のほぼ3分の1が奪取されます。私たちが衝突を見始めるまで、長くはありません。それは楽しいでしょう。 –

+1

この回答は古い情報を参照しています。 – user2864740

3

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

ここで私はそれをしました。私は繰り返し番号に正規表現を使用することができましたが、特定のものを無効にすると、そのリストに5つ以上のものを追加する可能性があります(エリア番号の検証のために5を超えると無効になります)。フィールドが数値で、validate関数を呼び出す前にすでに文字を取り除いているので、私はisNumeric(ssn)も省略しました。完全にランダム化されている2011 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; 
} 
+2

これらのルールはばかげています。誰かが '321214321'を偽造しようとしていると、彼らは偽の '102319982'(そして、はい、私はちょうどそれをランダムに入力しました)。最初の2つの特定のルールだけがAFAIKを実証しています。さらに、[以前の除外範囲は現在許可されている](http://www.socialsecurity.gov/employer/randomization.html)。 – user2864740

14

http://www.socialsecurity.gov/employer/randomization.html

残された唯一の本当のルールは以下のとおりです。

  • は(900から999で始めることはできません

    ものの、個々の納税者番号、することができます一時的な住人や非移民/ DACA/DAPA移民のSSNのように使用される場合もありますが、同じ形式であり、9から始まります)
  • で始まらない
  • は9桁の数字である必要があり、または2つのダッシュ
  • と11は、既知の偽物のいずれかとすることができません000
  • で開始できません。
    • 「078051120」—ウールワース財布フィアスコ
    • 「219099999」—は、これらは今技術的にではあるが、多くの人々は、同様に連続番号を繰り返し除外社会保障庁によって広告に
  • を使用しました私は貧しい人々のために申し訳ありません。
+0

[SSNランダム化FAQ](https://www.ssa.gov/employer/randomizationfaqs.html)によると、グループ(中2桁)またはシリアル番号(最後4)もすべて0になることはできません。 –

1

911年以降の社会保障番号のランダム化の時点で、900シリーズおよび666のエントリは現在有効な数字になっています。

この時点でのみ、特定の物事があるように見える:
3の最初のグループは中間のグループペアが00
になることはありませんし、最後の4は0000

になることはありません000
になることはありません

エントリの数値が> = 1010001 [および< 1000000000](001-01-0001のssanが正当に割り当てられた最低の数であるように見えること)を確認するために、最初にテストしてテストを実行できます。その後、ポジション4と5で00、最後の4で0000をチェックすることができます。

+3

最初の文および以下の前提条件/規則のために、参考文献を提供してください。他の(以前の回答)と[政府の文書](http://www.socialsecurity.gov/employer/randomization.html)に反している: "以前割り当てられていないエリア番号は、エリア番号000,666および900 -999。 – user2864740

11

回答Social Security Administrationによって検証規則が変更されたため、最初の質問から5年後です。また、linkに従って無効にする特定の番号があります。

私の2歳近くの答えによれば、フィールドは数字で、すでにvalidate関数を呼び出す前に文字を取り除いているので、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's minions from becoming residents of the US 
     area !== 666 && 
     // it's over 900 
     area < 900 && 
     // 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' 
    ); 
} 

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

0
ここ

は私の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; 
} 
1

である私は、これは古い質問ですけど、答えを探して他人のために、私は私がSSN与えられていることを確認するための迅速なJavaScript関数を追加したい考え出し有効です。 ssnRegex論理について

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

SSN番号900から999、666、000、または上記既知の不適格のSSNのいずれかで開始する場合、最初のセクションでは、ハンドル。

^(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)

また、数字を入力したことを確認し、繰り返し番号を使用しているだけではないことを確認します。

関連する問題