java.security.MessageDigest的用法
java.security.MessageDigest
MessageDigest的含义
message含义是:消息,信息
digest的含义是
digest
必应词典
n.摘要;文摘;概要;汇编
v.消化;领会;领悟;理解
海词
n. 摘要
vt. 消化;理解
vi. 消化
金山词霸
v.
消化; 理解
n.
摘要; 文摘
有道
v.
理解,领悟;消化
n.
文摘,摘要;分解物,提炼物
所以 MessageDigest 可以理解为 消息消化
额,不是.
应该是 信息摘要 或 数据摘要
它能将很大的信息(数据)(文件)通过某种算法(algorithm),简化为简短的内容, 用于判断大数据是否相同.
动态获取 MessageDigest 所支持的算法名称
java.security.Security.getAlgorithms("MessageDigest"); 可获得算法名称的Set<String>集合 , 参数为"MessageDigest",不区分大小写
java.util.Set<String> messageDigest_AlgorithmNames_Set = java.security.Security.getAlgorithms("MessageDigest"); //不区分大小写
java.util.Set<String> messageDigest_AlgorithmNames_Set = java.security.Security.getAlgorithms("messagedigest"); //不区分大小写
示例
public class Try动态获取MessageDigest支持的算法名称列表 {static Integer numA = 1;static public void main(String...arguments)throws Exception{java.util.Set<String> messageDigest_AlgorithmNames_Set = java.security.Security.getAlgorithms("messagedigest");
//		java.util.Set<String> messageDigest_AlgorithmNames_Set = java.security.Security.getAlgorithms("MessageDigest");System.out.println("MessageDigest的算法种类个数为: "+messageDigest_AlgorithmNames_Set.size() + " , 分别为👇");messageDigest_AlgorithmNames_Set.forEach(算法名称->{System.out.println(numA+++".\t\t"+算法名称);});		}
}
控制台输出👇 (JDK17)
MessageDigest的算法种类个数为: 13 , 分别为👇
1.		SHA3-512
2.		SHA-1
3.		SHA-384
4.		SHA3-384
5.		SHA-224
6.		SHA-512/256
7.		SHA-256
8.		MD2
9.		SHA-512/224
10.		SHA3-256
11.		SHA-512
12.		MD5
13.		SHA3-224
获取 MessageDigest 的实例
MessageDigest 的实例由 MessageDigest.getInstance(x) 方法获得;
 一个MessageDigest实例只能指定一种算法;
MessageDigest md_SHA3512   = MessageDigest.getInstance("SHA3-512");
MessageDigest md_SHA1      = MessageDigest.getInstance("SHA-1");
MessageDigest md_SHA384    = MessageDigest.getInstance("SHA-384");
MessageDigest md_SHA3384   = MessageDigest.getInstance("SHA3-384");
MessageDigest md_SHA224    = MessageDigest.getInstance("SHA-224");
MessageDigest md_SHA512256 = MessageDigest.getInstance("SHA-512/256");
MessageDigest md_SHA256    = MessageDigest.getInstance("SHA-256");
MessageDigest md_MD2       = MessageDigest.getInstance("MD2");
MessageDigest md_SHA512224 = MessageDigest.getInstance("SHA-512/224");
MessageDigest md_SHA3256   = MessageDigest.getInstance("SHA3-256");
MessageDigest md_SHA512    = MessageDigest.getInstance("SHA-512");
MessageDigest md_MD5       = MessageDigest.getInstance("MD5");
MessageDigest md_SHA3224   = MessageDigest.getInstance("SHA3-224");
将byte数组计算为Hash
MessageDigest 通过 update 和 digest 方法, 将一个或多个byte[]数组计算为Hash摘要
digest(byte[] input) 是一步到位的方法, 直接计算出input数组的Hash, 但是有一个问题, 数组索引是int, int<=Integer.MAX; 大概2G多, 所以对很大的文件无能为力.
digest(byte[] input) 的源码👇
public byte[] digest(byte[] input) {update(input);return digest();}
可看出也是分为两步, 第一步是update(input), 将数组放入MessageDigest,
 让后再digest()计算.
 实际上update方法可以多次调用,
 所以可以将大文件用缓存数组buffer拆分成多段用update放入
 而且update有个现成的重载:update(byte[] input, int offset, int len)
示例
				FileInputStream is = new FileInputStream(pathStr);MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] bf = new byte[10240];int numRead;do {numRead = is.read(bf);if (numRead > 0) {digest.update(bf, 0, numRead);}} while (numRead != -1);is.close();byte[] resultByteArray = digest.digest();
得到的结果还是byte数组, 可将其转为16进制
将digest的结果数组转为16进制
假设已得到结果: resultByteArray
将其转为16进制的办法
    public static String bytesToHex(byte[] bytes) {StringBuilder sb = new StringBuilder();for (int i = 0; i < bytes.length; i++) {sb.append(String.format("%02x", bytes[i]));}return sb.toString();}String resultHex = bytesToHex(resultByteArray)
小写
public static String hexLowerCaseFromByteArray(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)>>>4)).append(simple.charAt(b<<28>>>28));}return sb.toString();}String resultHex = bytesToHex(resultByteArray)
大写
	public static String hexUpperCaseFromByteArray(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)>>>4)).append(simple.charAt(b<<28>>>28));}return sb.toString();}String resultHex = bytesToHex(resultByteArray)
	public static String hexLowerCaseFromByteArray2(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)/16)).append(simple.charAt((b&0xff)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray2(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)/16)).append(simple.charAt((b&0xff)%16));}return sb.toString();}
	public static String hexLowerCaseFromByteArray3(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&255)/16)).append(simple.charAt((b&255)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray3(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&255)/16)).append(simple.charAt((b&255)%16));}return sb.toString();}	public static String hexLowerCaseFromByteArray4(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {int i=b>=0?b:b+256;sb.append(simple.charAt(i/16)).append(simple.charAt(i%16));}return sb.toString();}public static String hexUpperCaseFromByteArray4(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {int i=b>=0?b:b+256;sb.append(simple.charAt(i/16)).append(simple.charAt(i%16));}return sb.toString();}	public static String hexLowerCaseFromByteArray5(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt(Byte.toUnsignedInt(b)/16)).append(simple.charAt(Byte.toUnsignedInt(b)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray5(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt(Byte.toUnsignedInt(b)/16)).append(simple.charAt(Byte.toUnsignedInt(b)%16));}return sb.toString();}
测试
package 将byte数组转为16进制字符串的方法;import java.awt.FileDialog;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.security.MessageDigest;import javax.swing.JFrame;public class ByteArrayToHexString {public static String hexLowerCaseFromByteArray(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)>>>4)).append(simple.charAt(b<<28>>>28));}return sb.toString();}public static String hexUpperCaseFromByteArray(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)>>>4)).append(simple.charAt(b<<28>>>28));}return sb.toString();}public static String hexLowerCaseFromByteArray2(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)/16)).append(simple.charAt((b&0xff)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray2(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&0xff)/16)).append(simple.charAt((b&0xff)%16));}return sb.toString();}public static String hexLowerCaseFromByteArray3(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&255)/16)).append(simple.charAt((b&255)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray3(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt((b&255)/16)).append(simple.charAt((b&255)%16));}return sb.toString();}public static String hexLowerCaseFromByteArray4(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {int i=b>=0?b:b+256;sb.append(simple.charAt(i/16)).append(simple.charAt(i%16));}return sb.toString();}public static String hexUpperCaseFromByteArray4(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {int i=b>=0?b:b+256;sb.append(simple.charAt(i/16)).append(simple.charAt(i%16));}return sb.toString();}public static String hexLowerCaseFromByteArray5(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789abcdef";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt(Byte.toUnsignedInt(b)/16)).append(simple.charAt(Byte.toUnsignedInt(b)%16));}return sb.toString();}public static String hexUpperCaseFromByteArray5(byte[] byteArray) {if(byteArray==null)return null;String simple = "0123456789ABCDEF";StringBuilder sb = new StringBuilder(byteArray.length*2);for(byte b : byteArray) {sb.append(simple.charAt(Byte.toUnsignedInt(b)/16)).append(simple.charAt(Byte.toUnsignedInt(b)%16));}return sb.toString();}public static String hexLowerCaseFromByteArray6(byte[] byteArray) {if(byteArray==null)return null;StringBuilder sb = new StringBuilder();for (int i = 0; i < byteArray.length; i++) {sb.append(String.format("%02x", byteArray[i]));}return sb.toString();}public static void main(String...arguments)throws Exception{JFrame frame = new JFrame(Thread.currentThread().getStackTrace()[1].getClassName());frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent ev) {System.exit(0);}});FileDialog fDialog = new FileDialog(frame);fDialog.setVisible(true);if(fDialog.getFile()!=null) {String pathFile = fDialog.getDirectory()+fDialog.getFile();FileInputStream is = new FileInputStream(pathFile);MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] bf = new byte[10240];int numRead;do {numRead = is.read(bf);if (numRead > 0) {digest.update(bf, 0, numRead);}} while (numRead != -1);is.close();byte[] resultByteArray = digest.digest();String result;result = hexLowerCaseFromByteArray(resultByteArray); System.out.println(result);result = hexUpperCaseFromByteArray(resultByteArray); System.out.println(result);result = hexLowerCaseFromByteArray2(resultByteArray); System.out.println(result);result = hexUpperCaseFromByteArray2(resultByteArray); System.out.println(result);result = hexLowerCaseFromByteArray3(resultByteArray); System.out.println(result);result = hexUpperCaseFromByteArray3(resultByteArray); System.out.println(result);result = hexLowerCaseFromByteArray4(resultByteArray); System.out.println(result);result = hexUpperCaseFromByteArray4(resultByteArray); System.out.println(result);result = hexLowerCaseFromByteArray5(resultByteArray); System.out.println(result);result = hexUpperCaseFromByteArray5(resultByteArray); System.out.println(result);result = hexLowerCaseFromByteArray6(resultByteArray); System.out.println(result);}System.exit(0);}}一些应用例子
例1
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.security.MessageDigest;
import java.util.*;import javax.swing.*;//import javax.swing.JButton;public class SHA_MD_MessageDigest_230528 extends Frame{/*** */private static final long serialVersionUID = 5242216018207119189L;static void pln(Object o) {System.out.println(o);}public final SHA_MD_MessageDigest_230528 I;public final TextArea resultLowercaseShow = new TextArea("这里展示小写结果");public final TextArea resultUppercaseShow = new TextArea("这里展示大写结果");public final HashMap<String, MessageDigest> DigestGroup = new HashMap<>();public final LinkedHashMap<String, Panel> ButtonForComputedGroup  = new LinkedHashMap<>();{Set<String> set = java.security.Security.getAlgorithms("MessageDigest"); //获得支持的格式ArrayList<String> nmAl = new ArrayList<>(set);nmAl.sort((o1,o2)->o1.compareTo(o2));try {for(String nm : set) {DigestGroup.put(nm, MessageDigest.getInstance(nm));}nmAl.forEach(nm->{ButtonForComputedGroup.put(nm, new Btn(nm));});}catch(Exception ex) {ex.printStackTrace();}}//constructor 构造方法在此public SHA_MD_MessageDigest_230528() {I=this;setTitle("文件校验, 点击按钮选择文件 ");addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {I.dispose();System.exit(0);}});setLayout(new GridLayout(3, 0, 1, 3));Panel up = new Panel(); add(up); up.setBackground(Color.DARK_GRAY);Panel panel010 = new Panel(); add(panel010);
//		Panel panel020 = new Panel(); add(panel020);JPanel panel020 = new JPanel(); add(panel020);ButtonForComputedGroup.forEach((lb,btn)->{up.add(btn);});panel010.setLayout(new BorderLayout(200,200));  panel010.add(resultLowercaseShow);System.out.println(panel020.getLayout());panel020.setLayout(new BorderLayout());panel020.add(resultUppercaseShow);setBounds(258, 235, 1600, 666);setVisible(true);
//		show();}public static void main(String ags[]) {new SHA_MD_MessageDigest_230528();}void computed(String nm) {pln(nm);String lowercaseMapping = "0123456789abcdef" , uppercaseMapping = lowercaseMapping.toUpperCase();FileDialog fileDialog = new FileDialog(this, "选择要生成Hash的文件", FileDialog.LOAD);fileDialog.setVisible(true);String directoryStr = fileDialog.getDirectory() , fileStr = fileDialog.getFile();if(directoryStr!=null && fileStr!=null) {try {String pathStr = directoryStr+fileStr;resultLowercaseShow.setText("正在计算  "+pathStr+"   的"+nm+"值");FileInputStream is = new FileInputStream(pathStr);MessageDigest digest = DigestGroup.get(nm);byte[] bf = new byte[10240];int numRead;do {numRead = is.read(bf);if (numRead > 0) {digest.update(bf, 0, numRead);}} while (numRead != -1);is.close();bf = digest.digest();StringBuilder sb = new StringBuilder(bf.length*2);for(byte b : bf) {int idx1=(b&0xff)>>>4 , idx2=b<<28>>>28;pln("idx1="+idx1+"      idx2="+idx2);sb.append(lowercaseMapping.charAt(idx1)).append(lowercaseMapping.charAt(idx2));}String hexLower = sb.toString();resultLowercaseShow.setText(hexLower);sb = new StringBuilder(bf.length*2);for(byte b : bf) {int idx1=(b&0xff)>>>4 , idx2=b<<28>>>28;pln("idx1="+idx1+"      idx2="+idx2);sb.append(uppercaseMapping.charAt(idx1)).append(uppercaseMapping.charAt(idx2));}String hexUpper = sb.toString();resultUppercaseShow.setText(hexUpper);}catch(Throwable ex) {ex.printStackTrace(); resultLowercaseShow.setText(ex.toString()); }}}class Btn extends Panel{/*** 镶嵌在Panel中的Button*/private static final long serialVersionUID = -3494086542207800072L;public final Button btn;Btn(String label){super();this.setBackground(Color.blue);
//			setLayout(new BorderLayout());setLayout(null);setSize(210,60);btn = new Button(label);switch (label) {case"MD5","SHA-256": btn.setForeground(Color.BLUE); break;case"SHA-512": btn.setForeground(Color.WHITE);btn.setBackground(new Color(0,168,255)); break;}btn.setBounds(5, 5, 200, 50);setFont(new Font("宋体", Font.CENTER_BASELINE, 25));btn.addActionListener(ev->{computed(btn.getActionCommand());});add(btn);}}}
相关文章:
 
java.security.MessageDigest的用法
java.security.MessageDigest MessageDigest的含义 message含义是:消息,信息 digest的含义是 digest 必应词典 n.摘要;文摘;概要;汇编 v.消化;领会;领悟;理解 海词 n. 摘要 vt. 消化;理解 vi…...
 
3.2 分析特征间的关系
3.2 分析特征间的关系 3.2.1 绘制散点图 scatter()例子1:绘制2000-2017年各季度国民生产总值散点图例子2:使用不同颜色不同形状的点,绘制2000-2017年各产业各季度国民生产总值散点图 3.2.2 绘制折线图 plot()例子1:绘制2000-2017年…...
Numpy学习
Numpy官方手册:Array objects — NumPy v1.24 Manual 创建数组 1.1 从现有数据创建 重要类型 np.ndarray # 判断是否可以迭代 注意0维标量不可以遍历 print(__iter__ in dir(np.ndarray) and __getitem__ in dir(np.ndarray))np.array(object, dtypeNone) objec…...
 
IDC机房相电压与线电压的关系
380V电动机(三相空调压缩机)的电流计算公式为:Ⅰ=额定功率(1.732额定电压功率因数效率)。 功率因数是电力系统的一个重要的技术数据。功率因数是衡量电气设备效率高低的一个系数。功率因数低,说…...
 
chatgpt赋能python:Python如何设置输入的SEO
Python如何设置输入的SEO Python是一种高级的编程语言,具有容易上手、可扩展和开源等特点,因此在软件开发过程中得到广泛的应用。然而,如果您想让您的Python项目在搜索引擎上获得更好的排名和流量,您需要考虑如何设置输入的SEO。…...
 
Spring Cloud Alibaba — Nacos 构建服务注册中心
文章目录 Nacos Server下载启动登录创建命名空间 Nacos Client启动样例Nacos 服务发现配置项 集成 OpenFeign 远程接口调用添加 OpenFeign 依赖开启 EnableFeignClients 注解编写远程服务接口远程接口调用 集成 Sentinel 熔断降级添加 Sentinel 依赖开启 Sentinel 熔断降级编写…...
 
4.2 Spark SQL数据源 - 基本操作
一、默认数据源 案例演示读取Parquet文件 查看Spark的样例数据文件users.parquet 1、在Spark Shell中演示 启动Spark Shell 查看数据帧内容 查看数据帧模式 对数据帧指定列进行查询,查询结果依然是数据帧,然后通过write成员的save()方法写入HDF…...
 
事件相关功能磁共振波谱技术(fMRS)
导读 质子磁共振波谱(MRS)是一种非侵入性脑成像技术,用于测量不同神经化学物质的浓度。“单体素”MRS数据通常在几分钟内采集,然后对单个瞬态进行平均,从而测量神经化学物质浓度。然而,这种方法对更快速的神经化学物质的时间动态…...
 
跨境电商客户服务五步法
互联网技术的革新与升级对商务客服产生了巨大的影响,过去由在线客服与客户直接电联的单一服务形式被全渠道客服系统所替代。在电子商务时代,商家与客户之间的互动变得尤为重要:一方面,卖家通过分析客户喜好及消费趋向来针对性处理…...
hadoop环境配置及HDFS配置
环境与配置 ubuntu 20.04.6 /centos8hadoop 3.3.5 指令有部分不一样但是,配置是相同的 安装步骤 创建一个虚拟机,克隆三个虚拟机,master内存改大一点4G,salve内存1Gj修改主机名和配置静态ip(管理员模式下)) hostnamectl set-hostname node1 # 修改主机名 sudo passwd root …...
HTML中 meta的基本应用
meta 标签的定义 meta 标签是 head 部分的一个辅助性标签,提供关于 HTML 文档的元数据。它并不会显示在页面上,但对于机器是可读的。可用于浏览器(如何显示内容或重新加载页面),搜索引擎(SEO)或…...
docker compose 下 Redis 主备配置
1、准备两台虚拟机或者物理机 node1 IP:192.168.123.78 node2 IP:192.168.123.82 2、安装docker和docker compose 3、安装node1,配置docker-compose.yml version: 3services:redis-rs1:container_name: redis_node1image: redis:5.0.3rest…...
 
Tomcat ServletConfig和ServletContext接口概述
ServletConfig是一个接口,是Servlet规范中的一员 WEB服务器实现了ServletConfig接口,这里指的是Tomcat服务器 一个Servlet对象中有一个ServletConfig对象,Servlet和ServletConfig对象是一对一 ServletConfig对象是Tomcat服务器创建的…...
 
linux内核open文件流程
打开文件流程 本文基本Linux5.15 当应用层通过open api打开一个文件,内核中究竟如何处理? 本身用来描述内核中对应open 系统调用的处理流程。 数据结构 fdtable 一个进程可以打开很多文件, 内核用fdtable来管理这些文件。 include/linu…...
 
遗传算法讲解
遗传算法(Genetic Algorithm,GA) 是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法。它借用了生物遗传学的观点,通过自然选择、遗传和变异等作用机制,实现各个个体适应性的提高。 基因型 (G…...
PostgreSQL修炼之道之高可用性方案设计(十六)
20 高可用性方案设计(一) 在一个生产系统中,通常都需要用高可用方案来保证系统的不间断运行。本章将详细介绍如何实现PostgreSQL数据库的高可用方案。 20.1 高可用架构基础 通常数据库的高可用方案都是让多个数据库服务器协同工作࿰…...
Bybit面经
缘起 V2EX有广告内推,看描述还挺不错 贴主5 年半工作经验,有两年大厂工作经历,20 年 11 月来到新加坡分公司开始工作 后来是猎头Jeff找的我 0318 主面 主要一个面试官是后端开发金融背景 某条金融线的负责人;其余是交叉面试。面…...
 
GORM---创建
目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…...
高级查询 — 分组汇总
关于分组汇总 1.概述 将查询结果按某一列或者多列的值分组。 group by子句 分组后聚合函数将作用于每一个组,即每一组都有一个函数值。 语法 select 字段列表 from 表名 where 筛选条件 group by 分组的字段;select 字段列表 from 表名 group by 分组的字段 hav…...
 
【多线程】阻塞队列
1. 认识阻塞队列和消息队列 阻塞队列也是一个队列,也是一个特殊的队列,也遵守先进先出的原则,但是带有特殊的功能。 如果阻塞队列为空,执行出队列操作,就会阻塞等待,阻塞到另一个线程往阻塞队列中添加元素(…...
 
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
 
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
 
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
 
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
 
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
 
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
 
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
 
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
