哈夫曼树
基本概念一棵节点带权值的二叉树,若带权路径长度达到最小,称为最优二叉树,也叫哈夫曼树。权值越大离根节点越近。
带权路径
指当前节点值乘当前节点的层数
树的带权路径长度 WPL 为所有叶子节点的带权路径长度之和,注意是叶子节点,不包括分支节点
构造方法
给定N个权值,N个权值将会构造出一个有N个叶子节点的哈夫曼树。
将N个权值作为N个森林,每个森林的树只有一个节点
在森林中选出两个根节点的权值最小的树合并,作为一棵新的树,新树的根节点权值为其左右子树根节点权值之和。
从森林中删除选取的两棵树,并将新树加入森林。
重复3,4,直到森林中只剩一棵树,该树即为所求哈夫曼树
哈夫曼编码出现频率高的字符编码成较短的二进制数,而出现频率低的字符编码成较长的二进制树,这样可以用更少的比特数表示更多的字符,可应用于如数据压缩。
举例:
对字符串“aaa bb cccc dd e”其中的字符进行哈夫曼编码
统计各个字符出现的次数
a
空格
b
c
d
e
3
4
2
4
2
1
根据出现次数为权值进行哈夫曼树的构造
在树上进行编码,左分支编0,右分支编1
a
空格 ...
字符集
参考资料ASCII码一览表,ASCII码对照表 (biancheng.net)
UTF-8 到底是什么意思?unicode编码简介 - 知乎 (zhihu.com)
相关概念字节序字节序是指计算机存储数据时采用的字节排列顺序,在计算机科学中有两种字节序:大端字节序和小端字节序,大端字节序(Big-Endian)是指最高有效位在最低地址的字节序。小端字节序(Little-Endian)是指最低有效位在最低地址的字节序
BOMBOM是一个特殊的标记符,用于表示文本文件的字节序。
编码ASCII占用一个字节:8位,有效信息存储位7位,首位为0,一共128个字符
二进制
十进制
十六进制
字符/缩写
解释
00000000
0
00
NUL (NULL)
空字符
00000001
1
01
SOH (Start Of Headling)
标题开始
00000010
2
02
STX (Start Of Text)
正文开始
00000011
3
03
ETX (End Of Text)
正文结束
00000100
4
04
EOT (End Of Tran ...
fastjson
参考资料https://alibaba.github.io/fastjson2/spring_support_cn.html
spring框架集成fastjson2fastjson2在集成到spring框架时,引用的模块应该是fastjson-extension
且fastjson针对不同版本的springboot版本做了不同的封装
12345678910111213<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension-spring5</artifactId> <version>2.0.40</version></dependency>or<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-exten ...
log4j2
简介log4j2也是slf4j的实现之一,且在logback之后(融入了logback中的特性)
单独使用依赖1234567891011<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.22.0</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.22.0</ve ...
各种license
一张图来自阮一峰的博客,翻译自乌克兰程序员Paul Bagwell
jackson
参考资料https://blog.csdn.net/qq_41834086/article/details/111152470
序列化与反序列化实例实体类
12345678910111213141516171819202122package com.example.demo;public class Person { public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } String username; int age;}
...
encrypt
AES加密AES支持三种长度的密钥:128位、192位、256位,分别称之为AES128、AES192和AES256。
AES加密会把明文拆成一个一个的明文块,每个明文块128bit,如果最后一块长度不足128位,则默认使用缺失的字节数填充。接着对这些明文块分别加密,将加密结果拼接形成最终加密结果。
在加解密过程,每个明文块会作为4*4字节的矩阵进行处理
加密过程包括如下四步
AddRoundKey(轮密钥加)
矩阵中的每个字节都与该次轮密钥(round key)做异或运算
SubBytes(字节替代)
通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节
ShiftRows(行移位)
将矩阵中的每个横列进行循环式移位
MixColumns(列混淆)
为了充分混合矩阵中各个直行的操作,使用线性转换来混合每列的四个字节。
填充方式
不填充 NoPadding
不进行填充,要求明文必须位16个字节的整数倍。
长度填充 PKCS5Padding(默认)
填充的数据为16-最后一块字节数:相差长度
若明文为16个字节的整数倍,则填充16个字节的数据,其值都为16(16- ...
南京大学计算机科学实验
开发环境配置
非root用户使用sudo执行命令,需将其添加到sudo中,使用命令
123su -add username sudoexit
重启之后生效
在修改镜像的过程中,原教程操作为
1sudo echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list
虽然使用了sudo,但仍然会报权限问题,经查找,得知该段指令会被分为两步运行,echo 会使用sudo执行,但 > 会使用非sudo身份。
第一种解决方案(避免使用su)
1sudo su -c "echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list"
第二种(更安全)
1echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stabl ...
https
参考资料HTTPS原理和TLS认证流程全解析 - 知乎 (zhihu.com)
TLS 1.0 至 1.3 握手流程详解 - en_oc - 博客园 (cnblogs.com)
HTTPS协议http协议是明文传输,内容容易被中间人拦截后获取,且中间人可伪装为服务器,向客户端发送伪装的响应。
https在http应用层和tcp传输层中间加了一层SSL安全层,整个加密过程都没有侵入原先的http协议,故对http协议进行了很好的兼容。
TLS/SSLTLS协议就是SSL协议,SSL在被网景公司(Netscape)开发出来后,SSL1.0未公布,2.0具有重大缺陷,96年发布3.0,在SSL3.0的下一个版本便是TLS1.0,在此之后迭代TLS1.0、1.1、1.2和1.3,目前应用最广泛的为TLS1.2。
TLS加密原理类似于TCP会通过握手来建立连接,TLS也会通过握手来交换一些必要的基础信息。
既然TLS是为了保证传输安全,那肯定要对传输的数据进行加密,加密的方式一般有对称加密和非对称加密。
对称加密加密和解密都用的同一个密钥,由于CS方式的特殊性,如果采用对称加密,则会存 ...
tcp
TCP三次握手ACK和ack
ACK:TCP协议中的一个标志位,标识是否对上一个包进行了确认操作
ack:32位确认号,等于上一个包的序列号seq+1
此外
SYN:同步标志位,用于建立会话连接
seq:32位序号,通过该序号确认发送的数据是有序的
步骤
第一次,客户端将SYN位置1,表示开始建立同步会话。产生一个随机数x作为序列号seq,保存至TCP报文首部的序列号字段中。知名客户端打算连接的端口,将该数据包发送给服务器端,接着客户端进入SYN_SENT状态,等待服务端的响应。
第二次,服务端接收到数据包,先检查SYN标志位,发现为1,得知客户端要建立链接。于是服务端构造数据包:将SYN位和ACK位都置为1,表示当前要建立同步连接且对上一个包进行了确认,将ack字段填充为x+1,接着随机产生一个随机数y填入seq字段,发送给客户端,服务器进入SYN_Rcvd状态。
第三次,客户端检查ack字段是否为x+1,若接收到了,则将ack字段置为y+1发送给服务端,服务端接收后检查ack字段为y+1则建立连接。此时客户端和服务端进入ESTABLISHED状态,开始传输数据。
...