哈希表
哈希表又称散列表,其通过建立键key和值value之间的映射以实现高效的元素查询。与数组和链表对比,其添加元素、查询元素和删除元素的时间均为$O(1)$. 哈希表常用操作初始化、查询操作、添加键值对和删除键值对1234567891011121314151617// 初始化哈希表unordered_maps<int,string>map;// 在哈希表中添加键值对map[12345]="凉宫";map[12346]="长门";map[15532]="朝比奈";map[11451]="阿虚";map[18946]="古泉";// 查询操作// 向哈希表中输入键 key ,得到值 valuestring name = map[12346];// 删除操作// 在哈希表中删除键值对 (key, value)map.erase(12346); 123456789101112131415161718# 初始化哈希表hmap: dict = {}# 添加操作#...
栈与队列
栈栈(stack)是一种遵循先入后出逻辑的线性数据结构 通常我们能直接使用编程语言内置的栈类(C语言未提供) 123456789101112131415161718192021/* 初始化栈 */stack<int> stack;/* 元素入栈 */stack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);/* 访问栈顶元素 */int top=stack.top();/* 元素出栈 */stack.pop();/* 获取栈的长度 */int size = stack.top();/* 判断是否为空 */int size=stack.empty(); 栈的实现当我们使用的语言未提供栈类时,我们可以将该语言的“数组”或“链表”当作栈来使用,并在程序逻辑上忽略与栈无关的操作。 基于链表的实现 将链表的头节点视为栈顶,尾节点视为栈底。对于入栈操作,只需将元素插入链表头部,这种节点插入方法被称为“头插法” 1234567891011121314151617181920212223242526...
数组与链表
数组数组是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。 数组常用操作 初始化数组 在数组中访问元素非常高效,我们可以在$O(1)$时间内随机访问数组中的任意一个元素 123456int randomAccess(int *nums,int size){ int randomIndex=rand()%size; int randomNum=nums[randomIndex]; return randomNum;} 增删元素 数组元素在内存中是紧挨着的,它们之间没有空间再存放任何数据。如果想在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。 12345678void insert(int*nums,int size,int num,int index){ for(int i=size-1;i>index;i--) { nums[i]=nums[i-1]; } nums[index]=num;} 同理,删...
时间&空间复杂度
我个人理解的复杂度其实就是数量级。对于时间复杂度来说,其即为算法循环次数的数量级。确定的常数次就是$O(1)$,$x$层循环就是$O(n^x)$。 比较特殊的复杂度: 指数阶$O(2^n)$ 123456789101112131415int exponentail(int n){ int count=0; int bas=1; //类比细胞分裂一分二,二分四的过程 for(int i=0;i<n;i++) { for(int j=0;j<bas;j++) { count++; } bas*=2; } return count;} 对数阶$O(log n)$ 1234567891011int logarithmic(int n){ int count=0; //对数阶反映了“每轮缩减到一半”的情况 while(n>1) { ...
WindowsAPI学习笔记
Windows窗口程序基础在屏幕上显示一个窗口的过程一般包括以下步骤,也就是入口函数WinMain的执行流程: 注册窗口类 在注册之前,要先填写RegisterClassEx函数的参数WNDCLASSEX结构的各个字段。 创建窗口 显示窗口 、刷新窗口客户区 运行消息循环 获取消息、转换消息、将消息分发到回调函数WindowProc处理。 接下来分别介绍每一个步骤: 注册窗口类RegisterClassEx函数用于注册窗口类,其函数原型如下: 1ATOM RegisterClassEx(_In_const WNDCLASSEX* lpwcx); 其中参数lpwcx是一个指向WNDCLASSEX结构的指针,调用RegisterClassEx函数必须先初始化此结构: 1234567891011121314typedef struct tagWNDCLASSEX { UINT cbSize; // 结构体大小 UINT style; // 窗口类的样式 WNDPROC lpfnWndProc; // 窗口过程函数 ...
C++学习笔记(更新中)
基础的输入与输出 输出工具cout 1cout << "Hello World"; // 输出Hello World cout可根据变量类型自动识别输出格式,免去printf中要使用的如%d的格式控制符。 换行符endl 1cout << "Hello World" << endl; // 输出Hello World并换行 等效于输出"\n" 输入工具cin 12int a; cin >> a; // 输入a的值 cin根据变量类型自动识别输入格式,免去scanf中要使用的如%d的格式控制符。 插入运算符<<和>> 指明信息流动的路径 cout是一个ostream类对象,cin是istream类对象,它们都定义在iostream头文件中。要使用cout和cin,必须在程序开头包含iostream头文件,并使用using namespace std;编译指令使std名称空间内的名称可用。 数据处理 以...
ChaCha20算法总结
算法详解ChaCha20 是一种基于流密码的加密算法,由 Daniel J. Bernstein 于 2008 年提出,是 Salsa20 的改进版本。它的主要优点是速度快 、安全性高 且易于实现 。ChaCha20 将密钥(256 位) 、随机数(Nonce,96 位)和** 计数器(Counter,32 位)**经过一系列混合运算生成密钥流(Key Stream),再与明文进行按位异或得到密文。 ChaCha20 内部状态为一个 4×4 的 32 位无符号整数矩阵 ,初始排列如下: 1234[ 常量 ][ 常量 ][ 常量 ][ 常量 ] [ key0 ][ key1 ][ key2 ][ key3 ] [ key4 ][ key5 ][ key6 ][ key7 ] [counter][nonce0][nonce1][nonce2] 每一次加密生成 64 字节的密钥流块 ,ChaCha20 的核心是 Quarter Round(四分之一轮) ,它使用加法、异或、循环左移(ROTL)混合数据。 加密流程示意图: 实战识别在逆向分析中判断 ChaCha20 的常...
RC4算法及例题总结
算法详解Salsa20是一种流加密算法,是由 Daniel J. Bernstein 于 2005 年设计的流加密算法,速度快、安全性高,被广泛用于网络加密(如 Google 的 QUIC 协议)。它的加密方式是生成密钥流(Key Stream)与明文按位异或 ,从而得到密文(解密时也是异或,过程相同)。 加密流程示意图: 实战识别在逆向分析实战中判断Salsa20算法的可从一下几点入手: 初始化矩阵中出现 "expand 32-byte k" 或 "expand 16-byte k". 使用 ROTL32 循环左移 7、9、13、18 位 。 20 轮循环 ,且分为 “列变换” 与 “行变换” 两个阶段。 数据块为 64 字节 ,逐块生成密钥流。 代码实现下面是Salsa20算法过程的C语言函数实现 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626...
Hexo+Butterfly博客的评论系统实现(Giscus)
前情提要: Hexo+Butterfly主题博客搭建 Giscus是什么Giscus是一个基于GitHub Discussions的评论系统,它允许你将评论嵌入到你的网站中。其拥有开源、无需自建数据库等优点,你可以自由地使用和修改它。用户通过GitHub账户登录,简化注册流程,也增强了评论者的身份可信度、便于评论的及时回复与管理。 安装点击如下的链接进入Giscus的安装界面,点击install进行安装。 安装完成后看到如下的界面即说明安装成功 配置任选一个合适的仓库存储评论数据,但要确保: 仓库是公开的 Giscus功能已安装(“安装”步骤已完成) 仓库的Discussions功能已启用,开启方式如下所示: 在仓库的界面中,点击Settings进入设置界面 往下翻找到Discussions的选项并勾选 进入官网,在“仓库”中选择自己要使用的仓库,此时网站会自动确认该仓库是否满足上述条件。 后续是是一些个性化配置选项,这是推荐的配置建议: 页面↔️discussion 映射关系一项选择title ,使Discussion标题里的中文可以正常显示。 Discus...
Windbg双机调试配置
原理简介要使用Windbg进行内核级调试,必须进行双机调试配置,因为被调试的对象是整个虚拟机操作系统内核,而不仅仅是其中的某个应用程序或进程。 配置虚拟机的管道串口使用VMware制作Windows10虚拟机,安装完成后进入编辑虚拟机设置 ,若存在打印机 则将其移除(因为打印机占用了com_1端口,而后续双机通信要使用的就是com_1端口)。然后点击下方的添加 ,添加串行端口,选择使用命名的管道 并输入\\.\pipe\com_1,剩下两项保持默认的该端是服务器 和另一端是应用程序 ,勾选I/O模式中的轮询时主动放弃CPU ,最后点击确定。 此处展示本人已配置好的设置 配置被调试机的管道串口在虚拟机中以管理员身份运行命令行,依次输入如下指令: 1bcdedit /dbgsettings serial baudrate:115200 debugport:1 #设置端口com_1, baudrate为115200 1bcdedit /copy {current} /d DebugEntry #复制一个开机选项, 以进入OS的debug模式,需要...
