2009-10-04 13 views
29

Chiunque là fuori sa come migliorare questa funzione? Non sono preoccupato di accorciare il codice, sono sicuro che questo potrebbe essere fatto con una regex migliore, sono più preoccupato della logica corretta. Ho avuto un tempo terribile per trovare la documentazione per SSN #. La maggior parte delle regole che uso di seguito provengono da altri programmatori che lavorano nel settore del credito (nessuna fonte citata).Come posso convalidare il numero di previdenza sociale degli Stati Uniti?

  1. Ci sono delle regole aggiuntive a cui siete a conoscenza ?
  2. Sai se c'è qualcosa di sbagliato?
  3. Puoi visitare le tue fonti?

Grazie per qualsiasi intuizione!

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

risposta

20

UPDATE

Il 25 giugno 2011, la SSA ha cambiato il processo di assegnazione SSN a "SSN randomizzazione". [27] La randomizzazione SSN influisce sul processo di assegnazione SSN nei seguenti modi:

Elimina la significatività geografica delle prime tre cifre dell'SSN, precedentemente indicato come Numero area, non assegnando più i numeri di area per l'assegnazione ai singoli in stati specifici. Elimina il significato del numero di gruppo più elevato e, di conseguenza, l'Elenco dei gruppi elevati è congelato nel tempo e può essere utilizzato per la convalida dei codici SSN emessi prima della data di implementazione della randomizzazione. I numeri di area non assegnati in precedenza sono stati introdotti per l'assegnazione esclusi i numeri di area 000, 666 e 900-999.

nuove regole

  • Il numero di previdenza sociale è un numero di nove cifre nel formato "AAA-GG-SSSS". Il numero è diviso in tre parti.
  • Le due cifre centrali sono il numero di gruppo. I numeri di gruppo vanno da 01 a 99.
  • Le ultime quattro cifre sono numeri di serie. Rappresentano una sequenza numerica di cifre da 0001 a 9999 all'interno del gruppo.
  • Alcuni numeri speciali non vengono mai assegnati:
    • numeri con tutti gli zeri di qualsiasi gruppo cifre (000 - ## - ####, ### - 00 - ####, #### # -0000).
    • Numeri con 666 o 900-999 (numero identificativo del contribuente individuale) nel primo gruppo di cifre.
  • SSN used in advertising hanno reso tali numeri non validi.

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

risposta precedente

Ecco il most-complete description del trucco di uno SSN che ho trovato.

+1

@ user2864740: Ho aggiornato la risposta per riflettere le modifiche di giugno 2011. –

+0

Molto interessante. – Jeffpowrs

+0

ottima risposta. grazie. – catbadger

11

E 'tutto a socialsecurity.gov: Numbering scheme, allocations, highest numbers aggiornamento mensile.

+2

Sì. In sostanza, non è possibile * validare * un numero di previdenza sociale negli Stati Uniti. Non c'è cifra di controllo, per esempio. Circa il meglio che puoi fare è lanciare cose che sono ovviamente non valide. Tieni anche presente che il possibile dominio di un numero di previdenza sociale degli Stati Uniti è di 1 miliardo di valori discreti (0-999999999). Dato che ci sono lacune nel dominio reale a causa dello schema di allocazione e che ci sono più di 300 milioni di persone attualmente vive negli Stati Uniti, la maggior parte dei quali ha numeri di sicurezza sociale, quasi un terzo del dominio possibile è preso. Non ci vorrà molto prima che iniziamo a vedere le collisioni. Sarà divertente. –

+1

Questa risposta ora si riferisce a informazioni obsolete. – user2864740

3

Questo è ovviamente un vecchio post, ma ho trovato alcuni modi per accorciarlo. Inoltre ci sono alcuni numeri specifici da invalidare secondo questo link: http://www.snopes.com/business/taxes/woolworth.asp

Ecco come l'ho fatto. Avrei potuto usare regex per la ripetizione di numeri, ma con quelli specifici da invalidare potremmo anche aggiungerne uno in cinque alla lista (oltre 5 invalideranno comunque a causa della convalida del numero di area). Ho anche omesso numerico (ssn) perché il campo è numerico e già separa i caratteri prima di chiamare la funzione di convalida.

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

Queste regole sono stupide. Se qualcuno sta per fingere '321214321' potrebbe anche fingere '102319982' (e sì, l'ho appena scritto a caso). Solo le prime due regole specifiche hanno una richiesta motivata AFAIK. Inoltre [le precedenti gamme escluse sono ora consentite] (http://www.socialsecurity.gov/employer/randomization.html). – user2864740

14

A partire dal 2011 SSN di sono completamente randomizzati (http://www.socialsecurity.gov/employer/randomization.html)

Le uniche vere e proprie regole di sinistra sono:

  • non può iniziare con 900-999 (anche se il numero individuale Taxpayer Identification, che può essere utilizzato come un SSN da residenti temporanei e immigranti non documentati/DACA/DAPA in alcune situazioni, è nello stesso formato e inizia con 9)
  • Impossibile iniziare con 666
  • non possono iniziare con 000
  • Deve essere 9 cifre numeriche o 11 con i 2 trattini
  • Non può essere uno qualsiasi dei falsi noti;
    • "078.051.120" — Woolworth Portafoglio Fiasco
    • "219.099.999" — è stato utilizzato in un annuncio dal Social Security Administration
  • Molte persone escludere Ripetizione di numeri sequenziali e, anche se questi sono ora tecnicamente valido, e mi dispiace per il povero schmuck che gli viene assegnato.
+0

In base alle [Domande frequenti sulla randomizzazione SSN] (https://www.ssa.gov/employer/randomizationfaqs.html), anche il gruppo (2 cifre centrali) o il numero di serie (ultimi 4) non possono essere tutti 0. –

1

A partire dalla randomizzazione dei numeri di previdenza sociale dopo il 911, le voci della serie 900 e anche 666 sono ora numeri potenzialmente validi.

Le uniche certe cose in questo momento sembrano essere:
il primo gruppo di 3 sarà mai 000
la coppia gruppo di mezzo non sarà mai 00
e gli ultimi quattro saranno mai 0000

È possibile eseguire alcuni test eseguendo prima il test per assicurarsi che il valore numerico della voce sia> = 1010001 [e < 1000000000] (uno ssan di 001-01-0001 sembra essere il più basso assegnato legittimamente). Quindi puoi procedere a verificare 00 nelle posizioni 4 e 5 e 0000 negli ultimi quattro.

+3

Fornire un riferimento autorevole per la prima frase e le seguenti ipotesi/regole. Va contro altre (risposte precedenti) e [documentazione governativa] (http://www.socialsecurity.gov/employer/randomization.html): "Sono stati introdotti numeri di zona precedentemente non assegnati per l'assegnazione * esclusi i numeri di area 000, 666 e 900 -999 ". – user2864740

11

Risposta 5 anni dopo la domanda iniziale a causa di modifiche delle regole di convalida da parte dello Social Security Administration.Inoltre ci sono numeri specifici da invalidare in base a questo link.

Come per la mia risposta di quasi 2 anni, ho anche escluso numerico (ssn) perché il campo è numerico e separa i caratteri prima di chiamare la funzione di convalida.

// 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' 
    ); 
} 

Secondo le informazioni aggiornate non ci sono altri controlli da eseguire.

0

Ecco il mio PHP versione

/** 
* 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

So che questa è una vecchia questione, ma per il bene degli altri in cerca di risposte, ho pensato di aggiungere una funzione javascript rapido per controllare che una data SSN è valido.

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

Per la logica ssnRegex:

La prima sezione gestisce se SSN inizia con un numero 900-999, 666, 000, o uno dei SSNs interdittive noti sopra menzionati.

^(9 [0-9] [0-9] | 666 | 000 | 078.051.120 | 219.099.999 | 123456789 | 123.121.234 | 321214321)

seconda sezione assicura che la porzione 2 cifre non è 00

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

la terza sezione assicura che l'ultimo tratto non è 0000

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

Controlliamo inoltre per assicurarsi che abbiano immesso un numero e che non stiano usando solo un numero ripetuto.

Problemi correlati