小编典典

如何验证美国社会保险号?

algorithm

外面有人知道如何改善此功能吗?我不担心缩短代码,我相信可以用更好的正则表达式来完成,我更关心正确的逻辑。我花了很长时间才找到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;
    }

阅读 566

收藏
2020-07-28

共1个答案

小编典典

更新

2011年6月25日,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组成的最完整描述

2020-07-28