- 博客(43)
- 收藏
- 关注
原创 秘钥协商算法
从前面的介绍的密码学的4个目标中,了解到业务通信过程中的加解密常常使用的是对称加密来保证加解密的效率,而这个对称加密的秘钥也不是固定不变的,而是一个动态秘钥,在每一次的会话中,秘钥均不相同。那么,这个会话秘钥,该如何在业务通信前,通信双方都能获取到该会话秘钥,将是这一篇文章的主题。
2024-12-01 22:13:12
1046
原创 恋爱通信史之身份验证和不可抵赖性
保密性对称加密流密码算法:ChaCha20块密码算法:ECB模式,CBC模式,CTR模式等非对称加密公钥加密,私钥解密:秘钥交换私钥加密,公钥加密:数字签名,身份证书完整性单向散列算法:SHA-256, SHA-224, SHA-384, SHA-512等消息验证码算法:HMAC不可抵赖性数字签名:私钥对内容Hash值的加密得到的Hash值密文;身份验证身份证书:身份信息 + 对身份信息的数字签名。
2024-11-23 18:41:41
1138
原创 恋爱通信史之保密性
模式特点说明ECB模式加解密可并行;需要填充不安全,不推荐CBC模式加密串行,解密并行;加解密分块间有关联性;需要填充安全,推荐CTR模式加解密可并行;加解密分块间无关联性;无需填充安全,推荐。
2024-11-23 18:25:20
908
原创 小明与小芳的恋爱通信史
在一个风和日丽的校园里,小明与小芳的故事悄然绽放,如同春日里最温柔的花朵。在那个没有智能手机,互联网尚未普及的年代,他们的恋爱通信史是从一张张精心折叠的纸条开始的。每当课间休息,或是放学后的走廊转角,小明总会找机会悄悄递给小芳一张藏着深情密语的纸条,而小芳则以同样羞涩又期待的心情接收,两人的情感就这样在字里行间悄悄生长。然而,这段看似平凡的恋爱通信史,却因为一系列加密与解密的较量,而变得充满传奇色彩。
2024-11-23 12:56:28
966
原创 C++线程异常检测工具(Valrind之helgrind和DRD)
从日志中,也可以找到相应的锁的签名,看到其对应的关系和顺序。在平常工作生活中,可以借助检测结果,可以快速的发现,可能存在死锁风险问题。因此,通过查看每个锁占用的时间,根据自己的业务逻辑需要进行判定是否可以减小锁的范围,减小独占时间,提高并发性。只能检测某一个锁占用的时间,不能统计多处、多个锁的占用时间。一般程序退出时,都会解锁,但是在程序退出时,仍然持有锁,说明此处发生死锁了。此工具可支持检测:多线程接口使用问题、竞态问题、锁范围问题。首先将应用程序,编译多线程场景下的可执行程序,需要链接。
2024-09-18 00:37:56
665
原创 多线程虚假唤醒
可能很多人都有这个疑问,其实我们再深入分析就会发现,如果生产者线程半个小时才生产一个产品,那么消费者线程在这半个小时内也没闲着,一直在判定产品数量的个数是否大于0了。无效消费,产生的原因是,消费者只是判定了产品数量是否满足消费条件,但未继续等待,因此就浪费了一次消费机会。再次分析发现,一旦消费者发现产品数量为0,一直在等待生产者的生产,但是消费者占用了锁,生产者也获取不到锁,这就造成了一个。因此,条件变量可以让这个过程变得更加高效,生产者生产了产品,通知消费者,已经生产了产品了,消费者可以使用了。
2024-09-18 00:34:27
777
原创 多线程简介&应用
我们来先看一下冯诺依曼计算机硬件结构:在早期的简单批处理操作系统中,存储设备I/O相对于处理器速度太慢,导致处理器经常空闲。CPU利用率2/170.117611.76%:提高存储器的I/O速度。如果把存储设备的速度再提高,就可以提高CPU的利用率了。确实,在计算机发展的历史中,也在不断地提高存储设备的I/O速率。将计算机的存储设备,分级提高速率,并努力的靠近CPU,如下图所示:但是,尽管这样,仍然无法使得我们的存储设备I/O与CPU的速度媲美。
2024-09-18 00:17:15
678
原创 CMake之add_custom_target
在CMake中,用于定义用户target的函数,且不生成该target对应的文件。在该target中,可以执行相应的用户命令,即命令行下的shell命令,比如可以调用cmakepython和Linux下常用的终端命令行命令。其中,较为常用的为:COMMAND、DEPENDS、WORKING_DIRECTORY和COMMENT。
2023-08-30 22:02:40
707
原创 CMake之find_package
通过find_package引入开源软件的库(动态或者静态库,或者仅包含头文件的库)。CMake官方,在cmake安装路径下的/share/cmake-<version>/Modules目录中,为我们提供了许多寻找依赖包的Find<PackageName>.cmake命名的文件。具体相关模块的介绍,可以查看。注:在全量源码构建时,一般不会,也不能用cmake预定义的路径下的Find<PackageName>.cmake文件。由于Windows中,编写动态库,并使用动态库,代码书写比较麻烦。
2023-08-27 17:28:43
658
原创 CMake之install
将生成的库、可执行程序和相关接口头文件发布出去,install到固定的目录。其中,install的所有安装根目录,均是以。其中,main.cpp、add.cpp、add.h和模块目录CMakeLists.txt文件②的内容,和。config.json文件内容为空,仅仅用于示例需求。同样以之前的代码工程为例,简要介绍几种install的用法。详细的install介绍,可去。变量所表示的目录作为根目录。
2023-08-27 17:28:00
566
原创 CMake之CMake常用变量说明
CMAKE_SOURCE_DIR:整个CMake工程最顶层的CMakeLists.txt文件所在路径。CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt文件所在路径。CMAKE_CURRENT_LIST_DIR:当前*.cmake文件所在路径。CMAKE_BINARY_DIR: 构建目录的顶层路径。CMAKE_CURRENT_BINARY_DIR:构建当前CMakeLists.txt文件所在路径。CMAKE_INSTALL_PREFIX:执行make instal
2023-08-27 17:27:25
597
原创 CMake之头文件target
有时我们的代码功能都在头文件中实现,比如C++中的模板类及相关的成员函数定义或者简单的工具类函数。一般的library都是包含源文件(.cpp、.c)文件,因此我们要使用到。没有源文件,就将该target声明为interface,并指定该target的头文件所在路径为CMakeLists.txt所在的路径。的INTERFACE功能。main.cpp文件,与。
2023-08-27 17:26:40
211
原创 多文件单target
在平常写C++工程代码时,不止一个源文件,而是多个源文件和头文件组成。在此节中,借助简单的C++代码,简要介绍CMake单Target的场景。
2023-08-27 17:25:05
90
原创 CMake之Hello
使用CMake基于CMakeLists.txt文件生成为hello.cpp构建的Makefile文件,并基于此Makefile文件,构建生成相应的可执行程序。笔者当前仅使用了win10,因此以win10作为构建时的操作系统。建议:工具下载时,复制链接,使用迅雷工具下载,速度会更快。此时,已经在build目录下生成。
2023-08-27 17:23:55
123
原创 win10+WSL+Ubuntu环境搭建
查找路径:搜索"WSL"->搜索结果选择"Install WSL"->选择"Manual installation steps for older versions"章节的"Downloading distributions"小节]。此处,提供不在应用商店下载的网址,请查看。注:确定版本后,复制相应版本链接,推荐使用迅雷下载,相比浏览器直接下载,简直天壤之别。这一步骤,网上有很多介绍,此处不做一一介绍。执行解压后的ubuntu.exe文件,就可进入Ubuntu系统。将下载完成的文件,增加。
2023-08-27 16:34:39
374
原创 C++内存使用统计工具(Valgrind之massif)
如果读者使用的是Windows+WSL2的场景,那么就需要安装支持远程桌面和图形化界面的软件包。原因:vector容器,在存储数据时,内存空间不足,则需要申请当前内存的2倍空间,并将数据拷贝到新的内存空间中。应用程序运行一段时间后,内存确实在增长,使用valgrind的memcheck工具检测出来,确实没有出现。问题:从上述程序来看,存储了255个4字节的数据,占用空间约1KB的内存,为何占用了1.5KB的内存呢?结论:10240个4字节的元素,刚好为40KB的内存空间,与预期相符。
2023-08-27 16:29:04
3342
原创 Python之旅——类的继承属性搜索规则
类的继承属性搜索规则基于LEGB搜索规则,并根据类的继承关系树,自底向上,自左向右搜索,直到找到第一个属性为止。(如果未找到,抛出异常)图片来自:《Learning Python 5th Edition》一书Figure 26-1例如:C1继承C2和C3两个类,那么C1类的对象I1对某个属性的访问,搜索路径I1.name : I1;I1.x : I1->C1;I1.y : I1->C1;I1.z : I1->C1->C2;I1.w : I1-
2021-05-09 23:01:49
215
原创 Python之旅——类相关变量
类相关变量类变量类的变量,类所在的模块被加载时,初始化类变量及其所引用的对象。类变量引用可变类型1.修改可变类型对象成员类方式class Demo(object): a = [1, 2, 3] # list为可变类型if __name__ == "__main__": demo1 = Demo() Demo.a[1] = 88 # 类方式修改对象成员 demo2 = Demo() print("demo1.a=", demo1.
2021-04-18 11:37:39
158
2
原创 Python之旅——模块加载
模块加载模块加载时,主要完成以下动作:在当前模块中加载由import yy或者from xx import yy导入的未被其他模块导入过的模块;对模块中的类或者函数定义进行语法检查(ps:检查类属性和成员函数,不检查函数体),创建类定义对象和函数定义对象;执行模块中的外层语句;将类定义对象、函数定义对象和模块内的对象输出到该模块对应的二进制文件(.pyc为后缀的模块文件)。注:输出到二进制文件有以下两个好处避免模块被重复加载;多次运行程序,若模块未变化,将不再做语法检查,也不创建模块二
2021-04-12 23:50:16
355
1
原创 Python之旅——二维列表陷阱
二维列表陷阱有时候,我们会像下列方式,创建一个n*n的二维矩阵,并都初始化为0:n = 3grid = [[0] * n] * nprint(grid)代码输出:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]看到我们创建的二维矩阵,并都初始化为0了。高兴的接着往下对二维矩阵执行修改操作:n = 3grid = [[0] * n] * nprint(grid)grid[1][1] = 6print(grid)代码输出:[[0, 0, 0], [0, 0,
2021-02-19 21:37:48
209
原创 Python之旅——列表扩展
列表扩展+ :将加号两边的列表进行拼接得到一个新的列表(重新分配的内存空间)+=:将+=右边的列表追加到左边的列表,原地址空间首地址保持不变listA.append(listB):将listB列表作为一个元素添加到listA列表尾(仅占用listA一个元素空间),原地址空间首地址保持不变extend等价于+=+扩展列表listA = [1, 2, 3]listB = [4, 5, 6, 7]print(listA, "addr:0x%x" % id(listA))print(list
2021-02-17 21:25:10
758
1
原创 Python之旅——字符串与列表间转换
字符串与列表间转换字符串分割成列表sentence = "Hello world!"words = sentence.split()print(type(words))print(words)代码输出:<class 'list'>['Hello', 'world!']字符串列表拼接成字符串words = ["hello", "python!"]sentence = "-".join(words)print(type(sentence))print(sentence
2021-02-16 22:01:45
156
原创 Python之旅——列表深浅拷贝
列表深浅拷贝将列表中的值,拷贝到新的容器。先思考一下,采用下列方式,是否能达到拷贝列表的目的?nums = [1, 2, 3]copied_nums = numsprint(f"nums={nums}")print(f"copied_nums={copied_nums}")代码输出:nums=[1, 2, 3]copied_nums=[1, 2, 3]上述仅仅是,将copied_nums变量与nums变量都指向了相同的列表对象。如若不信,请查看下列代码:nums = [1, 2,
2021-02-16 19:29:34
191
2
原创 Python之旅——变量赋值
变量赋值python中,变量是对象的引用。变量赋值,即将变量指向值对象,对值对象的引用。值对象的分类:不可变对象可变对象值对象为不可变对象不可变对象,通俗的讲,就是不可以改变对象的内容。比如:数字,字符串,元祖tuple。变量指向的值对象不可变,但变量的指向可变,即可以改为指向新的值对象。1. 值对象为数字a = 10b = aprint("a addr: 0x%x val: %d" % (id(a), a))print("b addr: 0x%x val: %d" % (id(
2021-01-14 00:12:00
144
原创 Python之旅——字典映射(表驱动)实现switch功能
字典映射(表驱动)实现switch功能本文介绍python中可以使用字典的方式实现和C/C++的表驱动相同的功能,并且代码更加简洁。c/c++的表驱动代码:#include <map>#include <iostream>using namespace std;void foo1(int key){ cout << "foo1:" << key << endl;}void foo2(int key){ c
2021-01-13 23:03:13
1061
原创 Python之旅——函数传参
函数参数传值更多文章,请移步☞ https://gitee.com/youngzhiyong/bookPython一切皆对象!!!函数参数传值,函数形参作为对象的引用(形参指向实参对象)。a.常量对象作为函数参数常量对象是一个不可变的对象。当对形参再次赋值时,是形参变量指向一个另外的对象。def update(num): print("num_addr: 0x%x" % id(num), f"num_value:{num}") # id函数是输出对象地址 num = 5
2020-09-09 22:06:33
131
原创 python之旅——跨平台文件编码
文件编码1. python代码文件编码a. Python中的默认编码格式是ASCII格式,在未修改编码格式时,python2将无法解析中文编码。而python3可以进行正确的解析。b. 在python代码文件开头,使用下面两种方式之一标识当前代码文件的编解码(utf或UTF均可)#coding:utf-8#-\*-coding:utf-8-\*-2. 输出文本文件编码 with open("test.txt", "w") as fd: fd.write(test_str)
2020-08-23 21:11:10
223
原创 2.git——代码下载
1. 从远程个人仓库下载 git clone https://github.com/youngzhiyong/scrapy.git2. 只下载指定分支,当前以master分支为例 git clone -b master https://github.com/youngzhiyong/scrapy.git3. 下载当前分支master代码到指定目录dir_name ...
2019-02-11 21:53:36
204
原创 1.git——代码仓库管理总视图
使用git代码管理的一般流程如上图所示,以scrapy代码为例:私有远端库中没有scrapy代码工程,从公共远端库中fork一个工程到私有远端库。若私有远端库中有scrapy工程,那么只需要从公共远端库merge到私有个人库,对代码进行更新,私有远端库和公共远端库保持一致。 本地库中没有scrapy工程,需要从私有远端库中clone一个工程到本地。本地库中有scrapy工程,更新代码与个...
2018-12-16 10:10:41
751
原创 Python之旅——带着决心出发(第10步)
一、基础篇11.类实例方法调用在类实例方法定义中,第一个参数为self,可认为是实例对象本身,类似于C++中的this指针。两种等价的调用方式:1.obj.obj_method()2.MethodCall.obj_method(obj)注:类方法和类的静态方法不支持第二种调用方式,但支持第一种调用方式。代码举例:class MethodCall: def obj_method(self): pr...
2018-06-10 23:28:37
140
原创 Python之旅——带着决心出发(第9步)
一、基础篇10. 类继承属性搜索规则规则: 根据类的继承关系树,自底向上,自左向右搜索,直到找到第一个属性为止。(如果未找到,抛出异常)图片来自:《Learning Python 5th Edition》一书Figure 26-1例如:C1继承C2和C3两个类,那么C1类的对象I1对某个属性的访问,搜索路径 I1.name : I1; I1.x : I1->C...
2018-06-10 22:25:22
185
原创 Python之旅——带着决心出发(第8步)
一、基础篇9. 类变量、类成员变量、类实例方法、类方法、类静态方法a.类变量 VS 类成员变量类变量:为类所有实例和类本身所共有,使用类或者实例修改类变量,将会影响其他实例类成员变量:为类实例单独拥有,即每一个类实例的成员变量不在同一地址b.类实例方法 VS 类方法 VS 类静态方法类实例方法:第一个参数必须为self,表示实例自身;可调用类方法和类静态方法(self.method)类方法:第一个...
2018-05-13 17:56:12
159
转载 python import自定义模块方法(转载)
转自:http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html https://www.cnblogs.com/master-pokemon/p/6136483.htmlpython包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。下面将具体介绍几种常用情况:(1)主程序与模块...
2018-05-04 12:01:15
991
原创 Python之旅——格式化输出
一、基础篇4. 格式化输出参数 % round formata. %格式化输出的方式和C语言中的printf中的类似。b. round是入参进行四舍五入,但可能会受到计算机能表示浮点数精度影响。c. format的格式化输出比较灵活,可以使用{}或者{n}的方式输出。d. 多参数时,%格式化输出只能按照顺序输出;format的方式,可以根据指定的参数位置进行输出。代码示例:a. print中使用%...
2018-05-04 11:52:07
273
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人