首页 > 其他分享 >大陆居民身份证15位转18位

大陆居民身份证15位转18位

时间:2024-12-19 15:54:48浏览次数:3  
标签:map 15 18 list add 位转 put return

package com.audaque.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* <p>身份证号码15位转18位
* 判断15位身份证是否合法,合法进行身份证转换,返回18位身份证号,非法返回传入的身份证参数
* 合法性判定规则:
* (1)前6位是省份和城市的行政区划代码,6位数字且首位非0
* (2)第7-12位出生年月日,如670401代表1967年4月1日
* (3)第13-15位为顺序号,其中15位男为单数,女为双数。
* 身份证转换步骤:
* 1.在原15位数身份证的第6位数后面插入19
* 2.按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号
* 生成校验位规则同18位身份证校验码校验步骤
* </p>
*
* @author 谭黄
* @since 2023/11/1
*/
@org.apache.hadoop.hive.ql.exec.Description(name = "IdNumber15ConvertTo18",
extended = "示例:select IdNumber15ConvertTo18(name) from src;",
value = "_FUNC_(col)-将校验col字段是否为合法15位身份证号,合法返回转换的18位身份证号,非法返回入参")
public class IdNumber15ConvertTo18 extends UDF {

/**
* 验证15位身份证号码的正则,几乎是全数字 15位全数字,首位不为0
*/
private static final String REGEX = "^[1-9][0-9]{5}\\d{6}\\d{3}$";
/**
* 正则预编译
*/
private static final Pattern PATTERN = Pattern.compile(REGEX);

/**
* 函数的执行逻辑
* @param s
* @return
*/
public Text evaluate(final Text s) {
if (s == null) {
return null;
}
String text = s.toString();
//不是15位
if (!(text.length() == 15)) {
return new Text(text);
}
Matcher matcher = PATTERN.matcher(text);
//正则校验
if (!matcher.matches()) {
return new Text(text);
}
String dateStr = text.substring(6, 12);
//验证日期段
if(!isValidDate(dateStr)){
return new Text(text);
}
//插入19年,得到17位身份证号
String text17 = new StringBuilder(text).insert(6,"19").toString();
//计算校验码
char c = calculateChekeCode(text17);
return new Text(text17+c);


}

/**
* 根据前17位计算校验码,也就是第18位
*
* @param text17
* @return
*/
private char calculateChekeCode(String text17) {
char[] charArray = text17.toCharArray();
List<Integer> nums = new ArrayList<>();
for (char c : charArray) {
nums.add( (int)c - (int)('0'));
}
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
int value = nums.get(i) * COEFFICIENTS.get(i);
sum += value;
}
return VALUE_MAPPING.get(sum % 11);

}

/**
* 17位系数,用下标对应
*/
private final static List<Integer> COEFFICIENTS;
/**
* 余数和校验码的映射关系
*/
private final static Map<Integer,Character> VALUE_MAPPING;
static {
Map<Integer,Character> map = new HashMap<>(16);
map.put(0,'1');
map.put(1,'0');
map.put(2,'X');
map.put(3,'9');
map.put(4,'8');
map.put(5,'7');
map.put(6,'6');
map.put(7,'5');
map.put(8,'4');
map.put(9,'3');
map.put(10,'2');
VALUE_MAPPING=Collections.unmodifiableMap(map);
}
static {
List<Integer> list = new ArrayList<>(17);
list.add(7);
list.add(9);
list.add(10);
list.add(5);
list.add(8);
list.add(4);
list.add(2);
list.add(1);
list.add(6);
list.add(3);
list.add(7);
list.add(9);
list.add(10);
list.add(5);
list.add(8);
list.add(4);
list.add(2);
COEFFICIENTS= Collections.unmodifiableList(list);
}

/**
* 日期校验
* @param dateStr yyMMdd
* @return
*/
private static boolean isValidDate(String dateStr) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
dateFormat.setLenient(false); // 关闭宽松模式
try {
// 尝试解析日期字符串
Date date = dateFormat.parse(dateStr);
// 如果解析成功,且日期没有被解释为宽松模式,则认为是有效日期
return !dateFormat.isLenient();
} catch (ParseException e) {
// 解析失败,不是有效日期
return false;
}
}
}

标签:map,15,18,list,add,位转,put,return
From: https://www.cnblogs.com/tobeeasyman/p/18617393

相关文章

  • 大陆居民身份证18位身份证校验位校验udf关键代码
    packagecom.audaque.udf;importorg.apache.hadoop.hive.ql.exec.UDF;importorg.apache.hadoop.io.Text;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.*;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***......
  • OtterCTF 2018:内存取证
    做这个也是花了很长时间,很多指令都没见过,包括dump文件这种,都是之前没有使用过的,这些题也是参考了许多文章,会贴出链接,因为可能会有解释错的地方主要参考文章:OtterCTF—内存取证wp[OtterCTF2018]-内存取证-WP废话,网上也是很多写了这个比赛的wp,可能都会比我的更好,所以这里的......
  • 15-WAF文件上传绕过、网络后门分析&提权
    1、WAF绕过文件上传实验。利用双写filename=;进行绕过filename=;filename="info.php",成功上传实现绕过(证明WAF和Apache的检测规则+解析逻辑不同)利用无用文件头绕过保留请求数据包原有的格式(在请求头后的空白行和请求正文之间加入大量的无用数据),实现上传绕过......
  • 【2024-12-18】调整母亲的期望
    20:00一个人要保持勇气,须要从一切行为可以公开做起。这是第一着。第二件要不为劣等欲望之所牵制。                                                 ——XXX昨晚奶奶......
  • C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等......
  • USACO备考冲刺必刷题 | P1218 Superprime Rib
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方......
  • vue多语言包i18n
    一、安装如果是vue2直接安装8.2.1版本,否则会出现版本不匹配的错误npminstallvue-i18n@8.2.1--save二、文件编辑在src目录下创建文件分别创建文件内容,内容为需要翻译的字段en.jsexportconsth={system:"Backgroundmanagementsystem",loginOut:"Lo......
  • 12.18学习内容
    目录1、三角形画法2、消除图片间留白2.1  图片大小独占一行时①给元素设display:block②给元素设浮动:float:left2.2  一行有多张图片时①给父级设font-size:0②给父级设display:flex③给元素设浮动:float:left3、蒙层4、超出文本显示“...”5......
  • JAVA领域驱动设计DDD在B端营销系统的实践15
     1背景通过营销活动实现客户/用户拉新、留存和促活是业界普遍采用的方法。为实现商户增长和留存,美团核心本地商业/商业增值技术部也构建了相应的营销系统来支撑商户的线上营销运营。在系统建设过程中,面临着业务体量大、行业跨度大、场景多样、客户结构复杂,需求多变等挑战。......
  • 12月18号总结
    名称:混凝土承重等级预测在土木工程中,混凝土是构筑建筑物最基本的材料。混凝土可承受的强度与其寿命、制造所使用的材料、测试时的温度等因素息息相关。混凝土的制造过程十分复杂,涉及水泥、熔炉产出的煤渣和灰烬、水、强度塑化剂、粗聚合剂、细聚合剂等多种化工原料。我们用一个压......