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

2020-01-01 12:05:32 +08:00
 BlueSky335

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

https://github.com/bluesky335/IDCheck


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

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

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

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

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

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

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

使用方法

	go get github.com/bluesky335/IDCheck
5132 次点击
所在节点    程序员
15 条回复
Smash
2020-01-01 12:21:54 +08:00
元旦大家都不摸鱼了,挽尊
BlueSky335
2020-01-01 12:28:09 +08:00
@Smash 苦逼码农,我太难了😂
mscb
2020-01-01 12:42:06 +08:00
好东西,已 star
AMGRRR
2020-01-01 15:52:23 +08:00
这是干啥用的?
BlueSky335
2020-01-01 16:01:43 +08:00
@AMGRRR 身份证和统一社会信用代码是有校验位的,这个就是用来检验他们是不是正确的身份证号码和信用代码,确保不是乱填的。
MrUser
2020-01-01 16:06:33 +08:00
要是有试点地区早期的验证规则就完美了
BlueSky335
2020-01-01 16:13:50 +08:00
@MrUser 国标文件里没有写😂
loading
2020-01-01 16:25:05 +08:00
建议带上 js 代码,方便前后端一套。
T3RRY
2020-01-01 23:18:13 +08:00
收藏
BlueSky335
2020-01-02 13:14:15 +08:00
@loading 有空我加上
as80393313
2020-01-02 16:53:32 +08:00
@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
2020-01-03 10:18:49 +08:00
@as80393313 我加进去了,更新了一下
as80393313
2020-01-03 15:03:57 +08:00
@BlueSky335 嗯,我把它放在我的仓库了。0_0 !
https://github.com/ChrisDowney1996/validators
BlueSky335
2020-01-03 16:04:14 +08:00
@as80393313 已经添加链接,并移除了我仓库里的 js 代码。
as80393313
2020-01-03 17:12:45 +08:00
@BlueSky335 😂nice!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/634134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX