C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现
目录
腾讯云人脸核身技术
Craneoffice.net 采用的识别方式
1、活体人脸核身(权威库):
2、活体人脸比对:
3、照片人脸核身(权威库):
调用成本
百度云身份证识别
调用成本
相关结合点
核心代码
实现调用人脸核身API的示例
实现调用身份证识别API的示例
小结
腾讯云人脸核身技术
根据腾讯云的官方介绍,其慧眼人脸核身是一组对用户身份信息真实性进行验证审核的服务套件,提供人脸核身、身份信息核验、银行卡要素核验和运营商类要素核验等各类实名信息认证能力,以解决行业内大量对用户身份信息核实的需求。
Craneoffice.net 采用的识别方式
由于其产品众多,考虑一些综合因素,我们在 Craneoffice.net 架构里主要实现以下三种识别方式:
1、活体人脸核身(权威库):
流程为通过录制一段人脸活体静态视频,与大数据权威库身份证信息进行比对,判断是否为 同一人。
2、活体人脸比对:
流程为通过上传正确、清晰的身份证正面图片,截取头像图片,再通过录制人脸活体静态视频进行比对,判断是否为同一人。
3、照片人脸核身(权威库):
流程为上传正确的身份证正面图片,截取头像图片,传递身份证号与姓名,与大数据权威库身份证信息进行比对,判断是否为同一人。
调用成本
申请开发账号及具体费用情况请访问腾讯云人脸核身产品首页:
https://cloud.tencent.com/act/pro/huiyandiscount
我们的产品调用成本如下表,可参照一下比例,在此仅供参考:
| 识别方式 | 调用成功的成本 |
| 活体人脸核身(权威库) | 1元 / 每次 |
| 活体人脸比对 | 0.15元 / 每次 |
| 照片人脸核身(权威库) | 1元 / 每次 |
总之,在腾讯云商城购买越大的产品包调用成本越低,如果有优惠活动则更为合适。
百度云身份证识别
其官方宣传可以结构化识别二代居民身份证正反面所有8个字段,识别准确率超过99%;支持识别混贴身份证,适用于同一张图上有多张身份证正反面的场景;支持检测身份证正面头像,并返回头像切片的base64编码及位置信息,其具体详细产品介绍请访问如下地址:
https://ai.baidu.com/tech/ocr_cards/idcard
调用成本
我们使用的是企业申请,一个月应该可以享受2000次免费调用,后期调用应该是0.02元左右每次,具体可参照:
https://ai.baidu.com/ai-doc/OCR/fk3h7xune#%E8%BA%AB%E4%BB%BD%E8%AF%81%E8%AF%86%E5%88%AB
相关结合点
在人脸核身方面,虽然我们可以直接提供身份证号、姓名、自拍抠图的头像BASE64编码等参数传递给腾讯云识别接口,但考虑到实际应用场景中,更加规范、有效的验证有助于提升应用程序数据的质量和精准性,也更加保障了识别结果的准确性。
因此身份证的识别功能和人脸核身功能即可以单独独立运行,又可以利用产品特性相结合,实现数据采集、校验的双保险。
具体流程如下图:

核心代码
实现调用人脸核身API的示例
该示例代码以上小节的介绍的三种识别方式实现,仅供参考:
//定义人脸识别类public class FaceR{public string ResultJson = ""; //记录返回 json 结果public string apiurl = "faceid.tencentcloudapi.com"; //腾讯人脸识别API地址public string debuginfo = ""; //调试信息public string ErrorMessage = ""; //错误信息string[] signHeaders = null; //头部签名数组public FaceR(){}//活体人脸核身方法,参数为身份证号;检验类型,这里传固定值 SILENT;姓名;活体的静态视频编码;方法返回相似度值等信息public string LivenessRecognition(string IdCard,string LivenessType,string Name,string VideoBase64){string content = "{ \"IdCard\":\"" + IdCard + "\",\"LivenessType\":\"" + LivenessType + "\", \"Name\":\"" + Name + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";// 密钥参数string SECRET_ID = 你申请的IDstring SECRET_KEY = 你申请的KEYstring service = "faceid";string endpoint = "faceid.tencentcloudapi.com";string region = "ap-guangzhou";string action = "LivenessRecognition";string version = "2018-03-01";// 注意时区,建议此时间统一采用UTC时间戳,否则容易出错DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);date = DateTime.UtcNow;string requestPayload = content;Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service, endpoint, region, action, version, date, requestPayload);string rv = "POST https://faceid.tencentcloudapi.com\n";ArrayList hs = new ArrayList();foreach (KeyValuePair<string, string> kv in headers){rv += (kv.Key + ": " + kv.Value) + "\n";hs.Add(kv.Key + ": " + kv.Value);}rv += "\n";hs.Add("");rv += requestPayload + "\n";string[] hss = new string[hs.Count];debuginfo = "";for (int i = 0; i < hs.Count; i++){hss[i] = hs[i].ToString();debuginfo += hss[i] + "\r\n";}signHeaders = hss;string rvs = "";rvs=GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST",content, signHeaders);return rvs;}//活体人脸比对方法,参数为传递检验类型,这里传固定值 SILEN;身份证头像图片编码;活体的静态视频编码,方法返回相似度值等信息public string LivenessCompare(string LivenessType, string ImageBase64, string VideoBase64){string content = "{ \"LivenessType\":\"" + LivenessType + "\", \"ImageBase64\":\"" + ImageBase64 + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";// 密钥参数string SECRET_ID = 你申请的IDstring SECRET_KEY = 你申请的KEYstring service = "faceid";string endpoint = "faceid.tencentcloudapi.com";string region = "ap-guangzhou";string action = "LivenessCompare";string version = "2018-03-01";// 注意时区,建议此时间统一采用UTC时间戳,否则容易出错DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);date = DateTime.UtcNow;string requestPayload = content;Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service, endpoint, region, action, version, date, requestPayload);string rv = "POST https://faceid.tencentcloudapi.com\n";ArrayList hs = new ArrayList();foreach (KeyValuePair<string, string> kv in headers){rv += (kv.Key + ": " + kv.Value) + "\n";hs.Add(kv.Key + ": " + kv.Value);}rv += "\n";hs.Add("");rv += requestPayload + "\n";string[] hss = new string[hs.Count];debuginfo = "";for (int i = 0; i < hs.Count; i++){hss[i] = hs[i].ToString();debuginfo += hss[i] + "\r\n";}signHeaders = hss;string rvs = "";rvs = GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST", content, signHeaders);return rvs;}//照片人脸核身方法,参数传递身份证号;姓名;截取的身份证头像图片编码;方法返回相似度值等信息public string ImageRecognition(string IdCard,string Name, string ImageBase64){string content = "{ \"IdCard\":\"" + IdCard + "\", \"Name\":\"" + HttpUtility.UrlDecode(Name, Encoding.UTF8) + "\" ,\"ImageBase64\":\"" + ImageBase64 + "\"}";// 密钥参数string SECRET_ID = 你申请的IDstring SECRET_KEY = 你申请的KEYstring service = "faceid";string endpoint = "faceid.tencentcloudapi.com";string region = "ap-guangzhou";string action = "ImageRecognition";string version = "2018-03-01";// 注意时区,建议此时间统一采用UTC时间戳,否则容易出错DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);date = DateTime.UtcNow;string requestPayload = content;Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service, endpoint, region, action, version, date, requestPayload);string rv = "POST https://faceid.tencentcloudapi.com\n";ArrayList hs = new ArrayList();foreach (KeyValuePair<string, string> kv in headers){rv += (kv.Key + ": " + kv.Value) + "\n";hs.Add(kv.Key + ": " + kv.Value);}rv += "\n";hs.Add("");rv += requestPayload + "\n";string[] hss = new string[hs.Count];debuginfo = "";for (int i = 0; i < hs.Count; i++){hss[i] = hs[i].ToString();debuginfo += hss[i] + "\r\n";}signHeaders = hss;string rvs = "";rvs = GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST", content, signHeaders);return rvs;}//SHA256Hex算法public static string SHA256Hex(string s){using (SHA256 algo = SHA256.Create()){byte[] hashbytes = algo.ComputeHash(Encoding.UTF8.GetBytes(s));StringBuilder builder = new StringBuilder();for (int i = 0; i < hashbytes.Length; ++i){builder.Append(hashbytes[i].ToString("x2"));}return builder.ToString();}}//HMAC-SHA256算法public static byte[] HmacSHA256(byte[] key, byte[] msg){using (HMACSHA256 mac = new HMACSHA256(key)){return mac.ComputeHash(msg);}}//构造头部签名public static Dictionary<String, String> BuildHeaders(string secretid,string secretkey, string service, string endpoint, string region,string action, string version, DateTime date, string requestPayload){string datestr = date.ToString("yyyy-MM-dd");DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);long requestTimestamp = (long)Math.Round((date - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero) / 1000;// ************* 步骤 1:拼接规范请求串 *************string algorithm = "TC3-HMAC-SHA256";string httpRequestMethod = "POST";string canonicalUri = "/";string canonicalQueryString = "";string contentType = "application/json";string canonicalHeaders = "content-type:" + contentType + "; charset=utf-8\n"+ "host:" + endpoint + "\n"+ "x-tc-action:" + action.ToLower() + "\n";string signedHeaders = "content-type;host;x-tc-action";string hashedRequestPayload = SHA256Hex(requestPayload);string canonicalRequest = httpRequestMethod + "\n"+ canonicalUri + "\n"+ canonicalQueryString + "\n"+ canonicalHeaders + "\n"+ signedHeaders + "\n"+ hashedRequestPayload;Console.WriteLine(canonicalRequest);// ************* 步骤 2:拼接待签名字符串 *************string credentialScope = datestr + "/" + service + "/" + "tc3_request";string hashedCanonicalRequest = SHA256Hex(canonicalRequest);string stringToSign = algorithm + "\n"+ requestTimestamp.ToString() + "\n"+ credentialScope + "\n"+ hashedCanonicalRequest;Console.WriteLine(stringToSign);// ************* 步骤 3:计算签名 *************byte[] tc3SecretKey = Encoding.UTF8.GetBytes("TC3" + secretkey);byte[] secretDate = HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(datestr));byte[] secretService = HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service));byte[] secretSigning = HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request"));byte[] signatureBytes = HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign));string signature = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower();Console.WriteLine(signature);// ************* 步骤 4:拼接 Authorization *************string authorization = algorithm + " "+ "Credential=" + secretid + "/" + credentialScope + ", "+ "SignedHeaders=" + signedHeaders + ", "+ "Signature=" + signature;Console.WriteLine(authorization);Dictionary<string, string> headers = new Dictionary<string, string>();headers.Add("Authorization", authorization);headers.Add("Host", endpoint);headers.Add("Content-Type", contentType + "; charset=utf-8");headers.Add("X-TC-Timestamp", requestTimestamp.ToString());headers.Add("X-TC-Version", version);headers.Add("X-TC-Action", action);headers.Add("X-TC-Region", region);return headers;}//调用API地址,传递参数并获取返回值的通用方法public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData, string[] headers, string ContentType = "application/x-www-form-urlencoded"){method = method.ToUpper();System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;if (method == "GET"){try{WebRequest request2 = WebRequest.Create(@url);request2.Method = method;WebResponse response2 = request2.GetResponse();Stream stream = response2.GetResponseStream();StreamReader reader = new StreamReader(stream, encoding);string content = reader.ReadToEnd();return content;}catch (Exception ex){ErrorMessage = ex.Message;return "";}}Stream outstream = null;Stream instream = null;StreamReader sr = null;HttpWebResponse response = null;HttpWebRequest request = null;byte[] data = encoding.GetBytes(postData);// 准备请求...try{// 设置参数request = WebRequest.Create(url) as HttpWebRequest;CookieContainer cookieContainer = new CookieContainer();request.CookieContainer = cookieContainer;request.AllowAutoRedirect = true;request.Method = method;debuginfo = headers.GetLength(0).ToString()+"\r\n";if (headers != null){for (int i = 0; i < headers.GetLength(0); i++){if (headers[i].Split(':').Length < 2){continue;}debuginfo += i.ToString()+headers[i]+"\r\n";if (headers[i].Split(':').Length > 1){if (headers[i].Split(':')[0] == "Host"){request.Host = headers[i].Split(':')[1].Trim();continue;}else if (headers[i].Split(':')[0] == "Content-Type"){request.ContentType = headers[i].Split(':')[1].Trim();ContentType = headers[i].Split(':')[1].Trim();continue;}}request.Headers.Add(headers[i].Trim());}debuginfo += "sd2" + "\r\n";}request.ContentType = ContentType;request.ContentLength = data.Length;outstream = request.GetRequestStream();outstream.Write(data, 0, data.Length);outstream.Close();//发送请求并获取相应回应数据response = request.GetResponse() as HttpWebResponse;//直到request.GetResponse()程序才开始向目标网页发送Post请求instream = response.GetResponseStream();sr = new StreamReader(instream, encoding);//返回结果网页(html)代码string content = sr.ReadToEnd();return content;}catch (Exception ex){ErrorMessage = ex.Message;return "";}}//get response result}
实现调用身份证识别API的示例
public class IdCard{public string name = ""; //姓名public string sex = ""; //性别public string photo_base64 = ""; //截取的身份证头像图像的编码值 public string nation = ""; //民族public string address = ""; //住址public string IDNumber = ""; //身份证号public string birthday = ""; //生日public string org = ""; //发证机关public string startDate = ""; //有效期起public string endDate = ""; //有效期止public string ResultJson = ""; //记录返回的JSON值public string ErrorMessage = ""; //记录错误信息public string direction = ""; //上传时图片的方向public string image_status = ""; //上传图片的识别状态public string risk_type = ""; //上传图片的识别类型public string edit_tool = ""; //上传图片是否P图public string idcard_number_type = ""; //上传图片的识别错误信息public IdCard(){}//得到指定文件的 byte[],参数为文件绝对路径值private byte[] getImageByte(string imagePath){FileStream files = new FileStream(imagePath, FileMode.Open);byte[] imgByte = new byte[files.Length];files.Read(imgByte, 0, imgByte.Length);files.Close();return imgByte;}//识别身份证信息方法,参数为文件绝对路径值;正反面值:正面传 front,反面传 backpublic void valid(string imagePath, string id_card_side){name = "";sex = "";photo_base64 = "";nation = "";address = "";IDNumber = "";birthday = "";org = "";startDate = "";endDate = "";direction="";image_status = "";risk_type = "";edit_tool = "";idcard_number_type = "";byte[] image = getImageByte(imagePath);var APP_ID = 申请的开发ID;var API_KEY = 申请的开发KEY;var SECRET_KEY = 开发密钥;var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);client.Timeout = 60000; // 修改超时时间Newtonsoft.Json.Linq.JObject result = new JObject();var options = new Dictionary<string, object>{{"detect_risk", "true"},{"detect_direction", "true"},{"detect_photo", "true"}};try{result = client.Idcard(image, id_card_side, options);ResultJson = result.ToString();if (id_card_side == "front"){name = result["words_result"]["姓名"]["words"].ToString();sex = result["words_result"]["性别"]["words"].ToString();nation = result["words_result"]["民族"]["words"].ToString();address = result["words_result"]["住址"]["words"].ToString();IDNumber = result["words_result"]["公民身份号码"]["words"].ToString();photo_base64 = result["photo"].ToString();birthday = result["words_result"]["出生"]["words"].ToString();birthday = birthday.Substring(0, 4) + "-" + birthday.Substring(4, 2) + "-" + birthday.Substring(6, 2);}if (id_card_side == "back"){org = result["words_result"]["签发机关"]["words"].ToString();startDate = result["words_result"]["签发日期"]["words"].ToString();startDate = startDate.Substring(0, 4) + "-" + startDate.Substring(4, 2) + "-" + startDate.Substring(6, 2);endDate = result["words_result"]["失效日期"]["words"].ToString();endDate = endDate.Substring(0, 4) + "-" + endDate.Substring(4, 2) + "-" + endDate.Substring(6, 2);}direction = result["direction"].ToString();switch (direction){case "-1":direction = "未定义";break;case "0":direction = "正向";break;case "1":direction = "逆时针90度";break;case "2":direction = "逆时针180度";break;case "3":direction = "逆时针270度";break;}image_status = result["image_status"].ToString();switch (image_status){case "normal":image_status = "识别正常";break;case "reversed_side":image_status = "身份证正反面颠倒";break;case "non_idcard":image_status = "上传的图片中不包含身份证";break;case "blurred":image_status = "身份证模糊";break;case "other_type_card":image_status = "其他类型证照";break;case "over_exposure":image_status = "身份证关键字段反光或过曝";break;case "over_dark":image_status = "身份证欠曝(亮度过低)";break;case "unknown":image_status = "未知状态";break;}risk_type = result["risk_type"].ToString();switch (risk_type){case "normal":risk_type = "正常身份证";break;case "copy":risk_type = "复印件";break;case "temporary":risk_type = "临时身份证";break;case "screen":risk_type = "翻拍";break;case "unknown":risk_type = "其他未知情况";break;}if (ResultJson.IndexOf("edit_tool") != -1){edit_tool = result["edit_tool"].ToString();}else{edit_tool = "未P图";}if (ResultJson.IndexOf("idcard_number_type") != -1){idcard_number_type = result["idcard_number_type"].ToString();switch (idcard_number_type){case "-1":idcard_number_type = "身份证正面所有字段全为空";break;case "0":idcard_number_type = "身份证证号识别错误";break;case "1":idcard_number_type = "身份证证号和性别、出生信息一致";break;case "2":idcard_number_type = "身份证证号和性别、出生信息都不一致";break;case "3":idcard_number_type = "身份证证号和出生信息不一致";break;case "4":idcard_number_type = "身份证证号和性别信息不一致";break;}}}catch (Exception e){ErrorMessage = e.Message;}}}// idcard
小结
采用哪种识别方式,要根据我们在实际的应用场景中进行选择,而且也需要考虑调用的成本(本文涉及的调用成本仅供参考)。这里讲述的几种方案是我们自研产品中所采用的方式,腾讯云的人脸核身产品分支很多,大家可以根据具体需求进行选择、扩充自己的产品功能。
再次感谢您的阅读,欢迎大家讨论指正。
相关文章:
C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现
目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库): 2、活体人脸比对: 3、照片人脸核身(权威库): 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…...
LeetCode每日一题——275. H-Index II
文章目录 一、题目二、题解 一、题目 Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper and citations is sorted in ascending order, return the researcher’s h-index. According to the…...
项目添加EZOpenSDK之后就开始报错:could not build module foundation等
最近修改一个老项目,出现了一个报错问题。困扰了很久。现在终于找到解决方法了。分享一下。 正常的项目,使用pod引入EZOpenSDK之后就开始报错了,下面就是错误信息: could not build module foundation错误 could not build modul…...
“智能科技·链接未来”2024中国国际人工智能产品展览会·智博会
2024年中国国际人工智能产品展览会(简称世亚智博会)将于3月份在上海举办,6月份在北京举办。本届展会以“智能科技链接未来”为主题,将集中展示全球前沿的人工智能技术和应用,以及人工智能在各个领域的新成果。 本届展会…...
华为NAT配置实例(含dhcp、ospf配置)
一、网络拓朴如下: 二、要求:PC1 能访问到Server1 三、思路: R2配置DHCP,R2和R1配OSPF,R1出NAT 四、主要配置: R2的DHCP和OSPF: ip pool 1gateway-list 10.1.1.1 network 10.1.1.0 mask 25…...
怎样才能把视频号的视频保存到相册,怎么下载视频号视频两个方法轻松解决
在微信客户端想要下载视频号视频却不知道怎么保存到本地相册?让不少网友犯了难,不用在纠结怎么样才可以将视频号视频下载下来,今天就分享两个小程序将视频号视频提取出来,另外在告诉大家一个下载技巧,一定要看到到结尾…...
软考系统架构师知识点集锦七:计算机系统基础知识
一、考情分析 二、考点精讲 2.1计算机系统概述 2.1.1计算机系统组成 2.1.2 存储系统 时间局部性:指程序中的某条指令一旦执行,不久以后该指令可能再次执行,典型原因是由于程序中存在着大量的循环操作。 空间局部性:指一旦程序访问了某个存储单元,不久…...
k8s节点已有镜像,但Pod一直在拉取镜像时卡着
Pod状态为ContainerCreating,查看日志提示pull镜像,但该镜像在Node节点已经存在,且拉取策略为IfNotPresent 解决:重启kubelet...
用图说话——流程图进阶
目录 一、基本流程图 二、时序流程图 一、基本流程图 经常阅读歪果仁绘制的流程图,感觉比较规范,自己在工作中也尝试用他们思维来绘图,这是一个小栗子: 二、时序流程图 在进行Detail设计过程中,一般的绘图软件显得…...
深入了解 Elasticsearch 8.1 中的 Script 使用
一、什么是 Elasticsearch Script? Elasticsearch 中的 Script 是一种灵活的方式,允许用户在查询、聚合和更新文档时执行自定义的脚本。这些脚本可以用来动态计算字段值、修改查询行为、执行复杂的条件逻辑等等。 二、支持的脚本语言有哪些 支持多种脚本…...
激光雷达点云基础-点云滤波算法与NDT匹配算法
激光雷达点云处理在五年前就做了较多的工作,最近有一些新的接触发现激光雷达代码原理五年前未见重大更新,或许C与激光雷达结合本身就是比较高的技术门槛。深度学习调包侠在硬核激光雷达技术面前可以说是完全的自愧不如啊。 1、点云滤波 在获取点云数据…...
回收废品抢派单小程序开源版开发
回收废品派单抢派单小程序开源版开发 在这个废品回收抢单派单小程序开源版开发中,我们将构建一个专业且富有趣味性的平台,以深度的模式来重塑废品回收体验。 我们将提供一个会员注册功能,用户可以通过小程序授权注册和手机号注册两种方式快…...
粤嵌实训医疗项目--day04(Vue + SpringBoot)
往期回顾 粤嵌实训医疗项目--day03(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、用户详细信息查询 (查询信息与…...
redis加入window服务及删除
1、命令redis-server.exe --service-install redis.windows.conf,在服务中可配置自动启动 删除redis服务,先停止redis服务运行,管理员cmd模式,sc delete "redis" ,...
leetcode-哈希表
1. 理论 从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习 哈希表:用来快速判断一个元素是否出现集合里。也就是查值就能快速判断,O(1)复杂度; 哈希碰撞:拉链法,线性探测法等。只是一种…...
NOIP2023模拟6联测27 旅行
题目大意 有一个有 n n n个点 n n n条边的无向连通图,一开始每条边都有一个颜色 c c c。 有 m m m次操作,每次操作将一条两个端点为 x , y x,y x,y的边的颜色修改为 c c c。求每次修改之后,图中有多少个颜色相同的连通块。 一个颜色相同的…...
【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)
一、介绍 钢轨表面缺陷检测是指通过使用各种技术手段和设备,对钢轨表面进行检查和测量,以确定是否存在裂纹、掉块、剥离、锈蚀等缺陷的过程。这些缺陷可能会对铁路运输的安全和稳定性产生影响,因此及时进行检测和修复非常重要。钢轨表面缺陷…...
SHCTF 2023 新生赛 Web 题解
Web [WEEK1]babyRCE 源码过滤了cat 空格 我们使用${IFS}替换空格 和转义获得flag [WEEK1]飞机大战 源码js发现unicode编码 \u005a\u006d\u0078\u0068\u005a\u0033\u0074\u006a\u0059\u006a\u0045\u007a\u004d\u007a\u0067\u0030\u005a\u0069\u0030\u0031\u0059\u006d\u0045…...
二叉树题目合集(C++)
二叉树题目合集 1.二叉树创建字符串(简单)2.二叉树的分层遍历(中等)3.二叉树的最近公共祖先(中等)4.二叉树搜索树转换成排序双向链表(中等)5.根据树的前序遍历与中序遍历构造二叉树&…...
dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver
查看目标es服务版本,下载对应驱动...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
