V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BlueSky335
V2EX  ›  程序员

[Golang] 写了一个身份证号码、统一社会信用代码 的合法性校验工具库

  •  
  •   BlueSky335 · 2020-01-01 12:05:32 +08:00 · 5379 次点击
    这是一个创建于 1813 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目需要,没找到好用的,所以自己根据国标写了一个。分享一下。

    https://github.com/bluesky335/IDCheck


    身份证号码、法人和其他组织统一社会信用代码 的合法性校验

    License: MIT

    用于校验 身份证号码法人和其他组织统一社会信用代码 的工具。

    计算规则参考国家标准文件:

    注:由于早期部分试点地区推行 法人和其他组织统一社会信用代码 较早,会存在部分代码不符合国家标准的情况。但它们都是合法的代码,应当另行处理。 例如:

    福建恒跃柳工机械销售有限公司: 91350100M0001TGQXM 计算出的校验位是 1 和 M 不符

    厦门云上晴空航空科技有限公司:91350211M0000XUF46 计算出的校验位是 R 和 6 不符

    厦门黑脉网络科技有限公司91350203M0001FUE2P 计算出的校验位是 J 和 P 不符

    使用方法

    	go get github.com/bluesky335/IDCheck
    
    • 法人和其他组织统一社会信用代码

      import "github.com/bluesky335/IDCheck/USCI"
      
      var usci = USCI.New("91350100M000100Y43")
      if usci.IsValid() {
      		fmt.Printf("✅正确\n")
      } else {
      		fmt.Printf("❌错误\n")
      }
      
    • 身份证号码

      
      import "github.com/bluesky335/IDCheck/IdNumber"
      
      var id = IdNumber.New("11010519491231002X")
      if id.IsValid() {
      		fmt.Printf("%s -> %s\n", id, "✅正确")
      } else {
      		fmt.Printf("%s -> %s\n", id, "❌错误")
      }
      
    15 条回复    2020-01-03 17:12:45 +08:00
    Smash
        1
    Smash  
       2020-01-01 12:21:54 +08:00 via Android
    元旦大家都不摸鱼了,挽尊
    BlueSky335
        2
    BlueSky335  
    OP
       2020-01-01 12:28:09 +08:00
    @Smash 苦逼码农,我太难了😂
    mscb
        3
    mscb  
       2020-01-01 12:42:06 +08:00 via Android
    好东西,已 star
    AMGRRR
        4
    AMGRRR  
       2020-01-01 15:52:23 +08:00 via Android
    这是干啥用的?
    BlueSky335
        5
    BlueSky335  
    OP
       2020-01-01 16:01:43 +08:00
    @AMGRRR 身份证和统一社会信用代码是有校验位的,这个就是用来检验他们是不是正确的身份证号码和信用代码,确保不是乱填的。
    MrUser
        6
    MrUser  
       2020-01-01 16:06:33 +08:00
    要是有试点地区早期的验证规则就完美了
    BlueSky335
        7
    BlueSky335  
    OP
       2020-01-01 16:13:50 +08:00
    @MrUser 国标文件里没有写😂
    loading
        8
    loading  
       2020-01-01 16:25:05 +08:00
    建议带上 js 代码,方便前后端一套。
    T3RRY
        9
    T3RRY  
       2020-01-01 23:18:13 +08:00
    收藏
    BlueSky335
        10
    BlueSky335  
    OP
       2020-01-02 13:14:15 +08:00
    @loading 有空我加上
    as80393313
        11
    as80393313  
       2020-01-02 16:53:32 +08:00   ❤️ 1
    @loading
    作者写得有点香啊,这是基于他的改成 JS 版本,简单测试了一下可行,IE5+


    /**
    * @description 校验身份证 (计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E
    * @param value {string} 验证参数
    * @return {boolean}
    */
    function isID (value) {
    if (typeof value != 'string') {
    console.warn('参数类型错误:参数类型为 String')
    return false
    }
    // a1 与对应的校验码对照表,其中 key 表示 a1,value 表示校验码,value 中的 10 表示校验码 X
    var a1Map = {
    0: 1,
    1: 0,
    2: 10,
    3: 9,
    4: 8,
    5: 7,
    6: 6,
    7: 5,
    8: 4,
    9: 3,
    10: 2
    };
    var idStr = value.toUpperCase()
    var reg = /^[0-9]{17}[0-9X]$/
    if (!reg.exec(idStr)) {
    return false
    }
    var sum = 0
    var signChar = ''
    for (var index = 0; index < idStr.length; index++) {
    var i = 18 - index
    var c = idStr.charAt(index)
    var v, weight
    if (i != 1) {
    v = parseInt(c)
    if (!isNaN(v)) {
    // 计算加权因子
    weight = parseInt(Math.pow(2, parseFloat(i - 1))) % 11
    sum += (v * weight)
    } else {
    return false
    }
    } else {
    signChar = c.toString()
    }
    }
    var a1 = a1Map[sum % 11]
    var a1Str = a1.toString()
    if (a1 == 10) {
    a1Str = 'X'
    }
    return a1Str == signChar
    }

    /**
    * @description 校验法人和其他组织统一社会信用代码的合法性 (// 计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=24691C25985C1073D3A7C85629378AC0
    * @param value {string} 验证参数
    * @return {boolean}
    */
    function isUSCI (value) {
    if (typeof value != 'string') {
    console.warn('参数类型错误:参数类型为 String')
    return false
    }
    // 代码字符对应的值
    var valueMap = {
    '0': 0,
    '1': 1,
    '2': 2,
    '3': 3,
    '4': 4,
    '5': 5,
    '6': 6,
    '7': 7,
    '8': 8,
    '9': 9,
    'A': 10,
    'B': 11,
    'C': 12,
    'D': 13,
    'E': 14,
    'F': 15,
    'G': 16,
    'H': 17,
    'J': 18,
    'K': 19,
    'L': 20,
    'M': 21,
    'N': 22,
    'P': 23,
    'Q': 24,
    'R': 25,
    'T': 26,
    'U': 27,
    'W': 28,
    'X': 29,
    'Y': 30
    }
    var usciStr = value.toUpperCase()
    var reg = /^[A-Z0-9]{18}$/
    if (!reg.exec(usciStr)) {
    console.log('exec:')
    return false
    }
    var weight = 0, sum = 0, index = 0, c, v, usciStrRange = usciStr.slice(0, 17)
    for (index = 0; index < usciStrRange.length; index++) {
    c = usciStrRange.charAt(index)
    v = valueMap[c]
    weight = parseInt(Math.pow(3, parseFloat(index))) % 31
    sum += v * weight
    }
    var mod = sum % 31
    var sign = 31 - mod
    if (sign == 31) {
    sign = 0
    }
    var signChar
    for (var key in valueMap) {
    signChar = key
    if (valueMap[key] == sign) {
    break
    }
    }
    var lastStr = usciStr.slice(17, 18)
    var signStr = signChar.toString()
    return signStr == lastStr
    }
    BlueSky335
        12
    BlueSky335  
    OP
       2020-01-03 10:18:49 +08:00
    @as80393313 我加进去了,更新了一下
    as80393313
        13
    as80393313  
       2020-01-03 15:03:57 +08:00
    @BlueSky335 嗯,我把它放在我的仓库了。0_0 !
    https://github.com/ChrisDowney1996/validators
    BlueSky335
        14
    BlueSky335  
    OP
       2020-01-03 16:04:14 +08:00
    @as80393313 已经添加链接,并移除了我仓库里的 js 代码。
    as80393313
        15
    as80393313  
       2020-01-03 17:12:45 +08:00
    @BlueSky335 😂nice!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5868 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:54 · PVG 09:54 · LAX 17:54 · JFK 20:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.