java.security.MessageDigest的用法

news2024/11/27 2:18:35

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 通过 updatedigest 方法, 将一个或多个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();
	}

测试

packagebyte数组转为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() {
			@Override
			public 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);
		}
		
	}

}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进制转换(及规律)

Java变量命名规则和前端一样 约束 接口使用大驼峰 变量方法小托福 常量全大写 数值类型的 整型 byte a 1 所占空间1字节&#xff08;-128-127&#xff09; short a 1 所占空间2字节&#xff08;-32768-32767&#xff09;2^15-2^15-1 int a 1 所占空间4…

2023 华为 Datacom-HCIE 真题题库 11/12--含解析

单项选择题 1.[试题编号&#xff1a;190685] &#xff08;单选题&#xff09;通过iMasterNCE-Campus部署的虚拟化园区网络场景中&#xff0c;以下关于“添加设备”的描述中&#xff0c;错误的是哪一项&#xff1f; A、IMaster NCE-Campus支持通过设备角色添加设备 B、IMaster …

装饰器Python】进阶知识点

要明白装饰器首先得知道闭包 闭包&#xff1a;是内部函数对外部函数作用域的引用&#xff0c;并且一般外部函数函数的返回值是内部函数的函数名 def outer(x): # 外部函数 a x * 2 def inter(b) # 内部函数 …

手撕数据结构—单链表

✅作者&#xff1a;简单^不简单 &#x1f525;系列专栏&#xff1a;C语言数据结构 &#x1f496;如果文章有错误&#xff0c;时刻欢迎大家的指正。当然觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4ac;格言&#xff1a;希望我…

设计模式之-模板方法模式C++实现与C++模板template用法

介绍 模板方法模式使用比较常见&#xff0c;也比较简单&#xff0c;模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容&#xff0c;主要涉及算法和对象之间的职责分配。 模板方法模式使用场景&#xff1a;在设计需求中&#xff0c;…

java并发编程:synchronized关键字与锁详解

文章目录 线程安全问题synchroinzed关键字几种锁Java对象头偏向锁轻量级锁自旋锁重量级锁锁升级的场景 JVM 是如何实现 synchronized 的&#xff1f;小结 这篇文章我们来聊一聊Java多线程里面的“锁”。 首先需要明确的一点是&#xff1a;Java多线程的锁都是基于对象的&#x…

御用飞场之惊险炸鸡寻根溯源

御用飞场之惊险炸鸡寻根溯源 1. 源由2. 分析3. 证据4. 总结5. 补充&#xff1a;BetaFlight Mark4 自锁螺母桨叶松动 炸机瞬间 1. 源由 这个炸鸡的原因千奇百怪&#xff0c;不过最终的结果都是相似的。 如果能很好的找到根原因&#xff0c;相对来说&#xff0c;今后炸鸡的概…

element-ui表格el-table的使用

先给大家展示一下效果 Table 属性 属性名说明类型可选值默认值data显示的数据array——heightTable 的高度&#xff0c; 默认为自动高度。 如果 height 为 number 类型&#xff0c;单位 px&#xff1b;如果 height 为 string 类型&#xff0c;则这个高度会设置为 Table 的 sty…

初阶指针(详解)

目录 前言 一 指针是什么 计算机又是如何编址的&#xff1f; 总结 二 指针和指针类型 指针-整数 总结&#xff1a; 指针的解引用 总结 三 野指针 概念 野指针的成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间被释放 如何规避野指针 四 指针运算…

iMazing2.16.9中文最新版iOS设备管理器下载教程

iMazing2.16.9是一款兼容Win和Mac的iOS设备管理软件。iMazing能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。iMazing轻松管理和备份您的 iOS 设备,无需使用 iTunes&#xff0c;iMazing以自己的方式管理 iPhone。让备受信赖的软件为您传…

遗传算法(附简单案例及matlab详细代码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、生物进化二、遗传算法原…

华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

全闪SDS三节点EC(4+2:1)性能挑战测试

前段时间咱们存储圈在讨论一下全闪SDS性能挑战&#xff1a; 三节点集群&#xff0c;用EC&#xff08;42:1&#xff09;&#xff0c;性能目标是&#xff1a;4KB随机读写7:3&#xff0c;达到100万IOPS&#xff0c;平均时延0.5ms&#xff0c;P99时延1ms。硬件配置&#xff1a;网络…

菜鸟的刷题之路之二叉树

&#x1f495;“成功不是终点&#xff0c;失败不是终结&#xff0c;勇气才是启程的第一步。”&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;菜鸟的刷题之路&#x1f386; &#x1f697;本文章主要内容&#xff1a;将…

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程&#xff08;带证书&#xff09; 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录&#xff0c;并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它&#xff0c;运行下面的命令&#xff1a; sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节&#xff08;Byte&#xff09;等于8个二进制位&#xff08;bit&#xff09;。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位&#xff0c;可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…