身份证最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、将这17位数字和系数相乘的结果相加;
3、用加出来和除以11,看余数是多少;
4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。
--通过模得到对应的校验码
local identityCode = {
[0] = "1",
[1] = "0",
[2] = "X",
[3] = "9",
[4] = "8",
[5] = "7",
[6] = "6",
[7] = "5",
[8] = "4",
[9] = "3",
[10] = "2",
}
--防沉迷身份证校验
function ControlLogin.canAntiaddIdentity(identity)
if string.len(identity) ~= 18 then
return false
end
--不同的固定系数
local arr1 = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }
--校验码
local arr2 = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }
local sum = 0
local code = string.sub(identity, 18, 18)
local isHave = false
for i, v in pairs(arr2) do
if v == tostring(code) then
print("canAntiaddIdentity0", v, code)
isHave = true
end
end
if not isHave then
return false
end
for i = 1, (string.len(identity) - 1) do
local num = string.sub(identity, i, i)
print()
sum = sum + arr1[i] * num
end
print("canAntiaddIdentity1", sum, sum % 11, identityCode[sum % 7], code)
if identityCode[sum % 7] and tostring(identityCode[sum % 7]) == code then
return true
end
return false
end