《Python网络安全项目实战》项目6 编写密码工具程序
《Python网络安全项目实战》项目6 编写密码工具程序
- 项目6 编写密码工具程序
- 任务6.1 猜数字游戏
- 任务描述
- 任务分析
- 任务实施
- 6.1.1 编写基本的猜数字程序
- 6.1.3 测试并修改程序
- 6.1.4 给程序增加注释
- 任务拓展
- 任务实施
- 6.2.1 生成随机密码
- 6.2.4 菜单功能
- 相关知识
- 1. 密码字典
- 2. 密码字典生成软件
- 任务评价
- 任务拓展
- 项目评价
项目6 编写密码工具程序
在密码的使用过程中,我们给出一个密码经常是弱密码,这样的密码有一定的规律可以比较容易记忆。但是使用弱密码,很容易就可以对你的密码进行破解。所以我们要编写一个密码工具程序,对给出的密码进行测试,确定这个密码是不是弱密码,是不是可以使用。并且我们给出的程序功能,需要自动生成强密码,并对密码进行测试确定不是弱密码。
项目目标:
熟悉Python的关键要素;
熟练使用Python语言对数据安全、系统安全编程。
任务6.1 猜数字游戏
任务描述
项目经理要求我们编写猜数字游戏,从而模拟纯数字密码的生成与猜测。
任务分析
- 编写基本的猜数字程序
(1)编写一个程序,用来进行输出。
(2)使用模块random中的函数randint()生成一个随机整数。
(3)使用Python内置函数input()提示用户输入一个整数。
(4)对比两个数字,输出对比结果。 - 加入新功能更新版本
(1)为猜数字程序加入连续猜数的功能。
(2)测试并修改程序。
(3)给程序增加注释。
任务实施
6.1.1 编写基本的猜数字程序
【步骤1】:在项目一中我们已经完成了命令行交互操作时“Hello world!”的输出,如图6-1-1所示。
图6-1-1 交互输出
【步骤2】:下面我们编写一个程序,用来输出“Hello world!”,如图6-1-2所示。
图6-1-2 程序代码
【步骤3】:按F5执行,恭喜你,虽然这个程序只有一行代码,但是它已经可以运行了,如图6-1-3所示。
图6-1-3 程序输出
【步骤4】:我们将这个程序进行改进,使用模块random中的函数randint()生成一个随机整数,如图6-1-4所示。
图6-1-4 随机数生成
【步骤5】:程序每运行一次,就生成一个随机整数,如图6-1-5所示。
图6-1-5 随机数
【步骤6】:我们将这个程序进行改进加入输入功能,如图6-1-6所示。
图6-1-6 输入
【步骤7】:程序运行后输出一个从1到1000000之间的随机整数和一个用户输入的数字结果,如图6-1-7所示。
图6-1-7 输出
【步骤8】:使用int()内置函数将输入结果转换为整形,对比两个数字,如图6-1-8所示。
图6-1-8 对比
【步骤9】:运行结果如下,如图6-1-9所示。
图6-1-9 结果
6.1.2 为猜数字程序加入连续猜数的功能
【步骤1】:增加猜测机会,生成1到100之间的随机数,给9次猜测的机会,如图6-1-10所示。
图6-1-10 改进
【步骤2】:运行结果如下,如图6-1-11所示。
图6-1-11 运行
6.1.3 测试并修改程序
【步骤1】:设计测试用例,输入各种极端的数值,进行测试。
【步骤2】:修改程序,给程序增加容错,增强程序的键壮性,如图6-1-12所示。
图6-1-12 容错
【步骤3】:设计测试用例,输入各种极端的数值,进行测试。
6.1.4 给程序增加注释
【步骤1】:给程序增加注释,如图6-1-13所示。
图6-1-13 注释
【步骤2】:编制版本号,再次测试并提交程序,如图6-1-14所示。
图6-1-14 版本号
#程序完整代码如下:
#猜密码游戏:ver-0.1-20170712
import random #引入模块用于生成随机数
x = random.randint(1,100) #生成随机整数
for i in range(1,10): #当1<=i<10时循环try: #异常容错#等待用户输入,并将输入转换为整形y = int(input('请输入一个整数:'))except: #例外,程序出现异常时执行print('请检查,您输入的不是一个整数')continue #继续执行循环 if x>y: #如果x大于y执行print("太小了")elif x < y: #否则如果x小于y执行print("太大了")else: #否则执行下面的代码break #中断并跳出循环if x>y or x<y: #如果x大于y,和x小于yprint("你输了")
elif x == y: #否则如果x等于y,执行下级语句print("你赢了")
else: #否则执行下级语句print("输入错误")
如果以上代码你还无法看懂,不要着急,后面的项目中我们会对每一个知识和技能点进行学习。
相关知识
弱密码
弱密码(Weak passwords)即容易破译的密码,多为简单的数字组合、帐号相同的数字组合、键盘上的临近键或常见姓名,例如“123456”、“abc123”、“Michael”等。终端设备出厂配置的通用密码等都属于弱密码范畴。
设定密码的原则
密码共用问题:设定密码时,请选择一个没有在其他任何地方使用的密码。如果你在另一个服务也使用相同的密码,攻击者可以同时获得两个服务的访问。
密码有效时间:假定攻击者已经破解了密码,并可以访问云服务,那么每90天修改一次密码就非常关键。这种做法有助于防止攻击者进一步取得认证并窃取更多的敏感信息。
密码最短长度:密码长度应至少8位,虽然我们通常建议更长的密码。为了安全起见,造一个句子来作为你的密码。
密码强度:密码应该同时使用小写和大写字母,数字和特殊字符。这确保攻击者在暴力破解密码时必须通过更多数量的组合才能成功。
任务评价
请学生按照下表中的要求完成本次评价,并在物理机桌面上以自己的两位学号+姓名的形式命名文件夹,保存所有截图文件,文件保存为jpeg或 png格式。
任务拓展
1.编写程序,随机选取0到100间的偶数,并显示到屏幕。
2.编写程序,随机选取键盘可打印字符,并显示到屏幕。
任务6.2 编写密码工具程序
任务描述
使用python编写一个密码工具程序
任务分析
- 原形设计:
• 密码由大小写英文字母、数字、特殊符号组成,
• 将需要的字母、数字和符号放入列表,
• 使用random.sample()产生随机序列,
• 将选取的字符加入一个新的列表,
• 把生成的新列表中的字符连接成字符串作为密码 - 增加功能:
• 根据输入控制密码位数,
• 测试弱密码功能
• 菜单功能
任务实施
6.2.1 生成随机密码
【步骤1】:密码由大小写英文字母、数字、特殊符号组成,将需要的符号放入列表,如图6-2-1所示。
图6-2-1 符号列表
【步骤2】:使用Print()将列表打印出来,如图6-2-2所示。
图6-2-2 输出列表
【步骤3】:按F5运行程序将列表打印出来进行检查,如图6-2-3所示。
图6-2-3 运行
【步骤4】:在交互模式,引入random模块,使用random.sample()产生随机序列,如图6-2-4所示。
图6-2-4 随机序列
【步骤5】:将使用random.sample()产生随机序列的功能写入程序,如图6-2-5所示。
图6-2-5 程序
【步骤6】:按F5运行程序,产生一个16字符随机序列的列表,结果如下,如图6-2-6所示。
图6-2-6 运行
【步骤7】:使用’’.join()将列表内的随机序列连接成字符串,如图6-2-7所示。
图6-2-7 连接
【步骤8】:按F5运行程序,产生一个16字符的随机密码,如图6-2-8所示。
图6-2-8 随机密码
6.2.2 根据输入控制密码位数
至此我们已经写出一个自动生成16字符随机密码的小程序。现在大家思考下面两个问题:
我们可以人为的控制密码位数吗?
这个随机生成的密码你还能猜出来吗?
【步骤1】:输入密码长度,并转换为整形数值,用来控制生成密码的长度,如图6-2-9所示。
图6-2-9 密码长度
【步骤2】:程序要求输入密码长度的时候我们分别两次输入16、24,生成了相应长度的随机密码,如图6-2-10所示。
图6-2-10 生成密码
【步骤3】:程序要求输入密码长度的时候我们输入78,程序报错说我们输入的位数超过了样本列表charList的长度或者是负数,如图6-2-11所示。
图6-2-11 报错
【步骤4】:程序要求输入密码长度的时候我们分别两次输入77、16,生成了相应长度的随机密码,如图6-2-12所示。
图6-2-12 生成密码
【步骤5】:加入容错机制,如图6-2-13所示。
图6-2-13 容错
【步骤6】:输入超过77的数字、负数、字符,会提示输入错误,如图6-2-14所示。
图6-2-14 输入检查
【步骤7】:将以上程序定义成为一个函数,方便以后调用,如图6-2-15所示。
图6-2-15 函数定义
【步骤8】;修改程序,当输入错误时,函数返回默认16字符的随机密码,如图6-2-16所示。
图6-2-16 默认字符数
【步骤9】:将函数内的密码位数输入功能移出,改为函数调用时进行参数传递,如图6-2-17所示。
图6-2-17 参数传递
【步骤10】:将输入密码长度功能放入函数definLengPass()以备随后进行调用,现在我们调用randPass()生成16字符密码,如图6-2-18所示。
图6-2-18 函数调用
【步骤11】:现在我们调用definLengPass(),生成客户指定位数密码,如图6-2-19所示。
图6-2-19 生成密码
6.2.3 弱密码测试
本课程附了一个弱密码字典文件password.txt,使用该文件能猜测出网民常用的密码, password.txt文件内的部分内容如下:
国内网民常用的25个弱密码包括:000000、111111、11111111、112233、123123、123321、123456、12345678、654321、666666、888888、abcdef、abcabc、abc123、a1b2c3、aaa111、123qwe、qwerty、qweasd、admin、password、p@ssword、passwd、iloveyou、5201314、asdfghjkl、66666666、88888888
国外网民常用的25个弱密码包括:password、123456、12345678、qwerty、abc123、monkey、1234567、letmein、trustno1、dragon、baseball、111111、iloveyou、master、sunshine、ashley、bailey、passw0rd、shadow、123123、654321、superman、qazwsx、michael、football、asdfghjkl
【步骤1】:请用户输入密码,在password.txt当中进行查找,如果找到,就停止并提示用户“找到它了,这是一个弱密码”,如图6-2-20所示。
图6-2-20 弱密码测试
【步骤2】:自动生成一个密码,并在弱密码文本里进行查找,你会发现,位数较短的密码有时会在密码文本里找到,但是自动生成的六位以上的密码很难在弱密码文本里找到,如图6-2-21所示。
图6-2-21 密码生成
6.2.4 菜单功能
【步骤1】:加入选择,可以让用户决定用于生成密码还是弱口令检查,如图6-2-22所示。
图6-2-22 功能选择
#下面是程序的代码
import random
def randPass(length):"""生成随机密码"""charList = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','0','~','!','#','$','%','^','&','*','(',')','-','=','+','_']try: password = ''.join(random.sample(charList,length))return(password)except: password = ''.join(random.sample(charList,16))return(password)
def definLengPass():try:length = int(input("请输入密码长度,超过77将返回默认的16字符密码:"))return(randPass(length))except:print('输入错误!')exit
def findPass(password):f = open('password.txt','r')for line in f.readlines():print(line,password)if line.strip('\n') == password:print("找到它了,这是一个弱密码")break
def main():flag = input('1.密码生成\n2.弱口令测试\n请选择(1/2):')if flag == '1':password = definLengPass()print(password)elif flag == '2':password = input('请输入密码:')findPass(password)print(password)else:print('输入错误!')main()
【步骤2】:按F5运行程序,会出现下列选择菜单,我们选择1.密码生成并回车,然后提示输入密码长度的时候我们现在输入32,然后计算机给出了一个32字符长度的随机密码,如图6-2-23所示。
图6-2-23 程序运行
【步骤3】:按F5运行程序,会出现下列选择菜单,我们选择2.弱口令测试并回车,然后输入一个密码,这里我们输入‘paper’并回车,计算机就会开始在密码文本里面开始搜索这个密码,如图6-2-24所示。
图6-2-24 弱口令测试
【步骤4】:当计算机在密码文本里找到这个密码的时候会提示“找到它了,这是一个弱密码”显示出这个密码并停止查找,如图6-2-25所示。
图6-2-25 测试结果
【步骤5】:给程序增加添加密码字典功能,如图6-2-26所示。
图6-2-26 密码字典
【步骤6】:给程序添加退出功能,如图6-2-27所示。
图6-2-27 退出功能
#下面是程序的代码
import random
def randPass(length):"""生成随机密码"""charList = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','0','~','!','#','$','%','^','&','*','(',')','-','=','+','_']try: password = ''.join(random.sample(charList,length))return(password)except: password = ''.join(random.sample(charList,16))return(password)
def definLengPass():try:length = int(input("请输入密码长度,超过77将返回默认的16字符密码:"))return(randPass(length))except:print('输入错误!')exit
def findPass(password):f = open('password.txt','r')for line in f.readlines():#print(line,password)if line.strip('\n') == password:return(True)#print("找到它了,这是一个弱密码")breakf.close()
def testPass(password):if findPass(password):print(password+"密码字典中已经存在,这是一个弱密码")else:print(password+"密码字典中不存在,如果是一个弱密码,请加入密码字典!")
def saveToDicPass(password):f = open('password.txt','a')f.writelines('\n'+password)f.close()
def menuDisply():flag = input('''\n1.密码生成\n2.弱口令测试\n3.生成密码=>弱口令测试\n4.添加弱口令字典\n5.退出\n请选择(1/2/3/4/5):''')if flag == '1':password = definLengPass()print(password)menuDisply()elif flag == '2':password = input('请输入密码:')testPass(password)menuDisply()elif flag == '3':password = definLengPass()testPass(password)menuDisply()elif flag == '4':password = input('请输入弱密码:')if findPass(password):print(password+"密码字典中已经存在")else:saveToDicPass(password)if findPass(password):print(password+"成功加入密码字典")else:print(password+"加入密码字典没有成功")menuDisply()elif flag == '5':exitelse:print('输入错误')def main():menuDisply()main()
【步骤7】:程序运行显示功能菜单,完成后可以选择退出,如图6-2-28所示。
图6-2-28 功能菜单
相关知识
1. 密码字典
密码字典,是配合密码破译软件所使用的。密码字典里包括许多人们习惯性设置的密码,这样可以提高密码破译软件的密码破译成功率和命中率,缩短密码破译的时间。
如果一个人密码设置没有规律或很复杂,未包含在密码字典里,这个字典就没有用了,甚至会延长密码破译所需要的时间。
2. 密码字典生成软件
目前常用的密码字典生成软件,主要为以下几款:
• 木头字典生成器。
• 黑刀超级字典生成器。
• 真空密码字典生成器。
• 万能钥匙字典生成工具。
任务评价
请学生按照下表中的要求完成本次评价,并在物理机桌面上以自己的两位学号+姓名的形式命名文件夹,保存所有截图文件,文件保存为jpeg或 png格式。
任务拓展
- 收集并总结国内常用弱密码,并将其加入你的密码字典
- 收集并总结国外常用弱密码,并将其加入你的密码字典
项目评价
相关文章:

《Python网络安全项目实战》项目6 编写密码工具程序
《Python网络安全项目实战》项目6 编写密码工具程序 项目6 编写密码工具程序任务6.1 猜数字游戏任务描述任务分析任务实施6.1.1 编写基本的猜数字程序6.1.3 测试并修改程序6.1.4 给程序增加注释 任务拓展任务实施6.2.1 生成随机密码6.2.4 菜单功能 相关知识1. 密码字典2. 密码字…...
现代C++HTTP框架cinatra
文章目录 cinatra简介主要特点 快速上手编译器版本要求使用指南快速示例 项目地址 cinatra简介 cinatra是一个基于C20协程的高性能HTTP框架,它的目标是提供一个快速开发的C HTTP框架解决方案 它不仅支持HTTP/1.1和1.0,还支持SSL和WebSocket,…...

【功耗现象】com.gorgeous.lite后台Camera 使用2小时平均电流200mA耗电量400mAh现象
现象 轻颜相机(com.gorgeous.lite)后台Camera 使用2小时平均电流200mA(BugReport提供的电流参考数据),耗电量400mAh 即耗电占比(200mA*2h)/(12.83h*52.68mA )400mAh/623mAh62% CameraOct 10 202321:03:08 - 23:03:372h16m15s859ms to 4h16m44s984msactive duration: 2h 0m 29…...

06.VSCODE:备战大项目,CMake专项配置
娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者&…...

还是小时候味道的麻辣片
麻辣片的诞生,源于人们对辣味的热爱和对丰富口感的追求。它将辣椒的火辣、香料的浓郁和豆制品的醇厚完美结合在一起,创造出了一种令人回味无穷的美食体验。无论是在学校的小卖部、街头的小吃摊,还是超市的货架上,麻辣片都以其鲜艳…...
GaussDB部署架构
GaussDB部署架构 云数据库GaussDB管理平台(TPOPS)基于B/S架构开发,由Web、管控Service、管控Agent三部分组成,软件结构如图1所示。 图1 各节点部署架构 Web:作为用户接入子系统,用于将用户在Web下发的操作…...

遥测数据采集工具Grafana Alloy
介绍 Alloy是Grafana产品公司旗下的一款新主推遥测数据采集工具,Grafana Alloy也是一个开源OpenTelemetry收集器,具有内置 Prometheus管道并支持指标、日志、跟踪和配置文件。Alloy支持为OTEL、Prometheus、Pyroscope、Loki等服务提供许多指标、日志、跟…...

线性数据结构
数组 数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。 数组…...

【ArcGIS微课1000例】0127:计算城市之间的距离
本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…...
【算法】二分
1. 找到有序区间中 x 最左边的数字的位置 static int getL(int a[], int l, int r, int x) {while (l < r) {int mid l r >> 1;if (x < a[mid]) {r mid;} else {l mid 1;}}if (a[l] ! x) return -1;return l;} 2. 找到有序区间中 x 最右边的数字的位置 stati…...
ARM CCA机密计算安全模型之简介
安全之安全(security)博客目录导读 目录 1、引言 2、问题陈述 3、CCA 安全保证 3.1 对领域所有者的安全保证 3.2 对host环境的安全保证 Arm 机密计算架构(CCA)安全模型(SM)定义了 CCA 隔离架构的安全要求和基本安全属性。这…...

蓝桥杯-洛谷刷题-day3(C++)
目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…...
K8S资源限制之ResourceQuota
ResourceQuota介绍 在K8S中,大部分资源都可以指定到一个名称空间下,因此可以对一个名称空间的计算资源,存储资源,资源数量等维度做资源限制。 如限制pod数量、svc数量,控制器数量,限制PVC请求的存储量 注…...

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o
在不断发展的人工智能领域,Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用,突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…...

MongoDB索引操作和执行计划Explain()详解
一、索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例。 字段内容如下: {"_id" : ObjectId("63ec5a971ddbe429cbeeffe3"), // object id"car_type" : "Gett", // string&…...

H3C NX30Pro刷机教程-2024-11-16
H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…...

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…...

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)
HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…...
org.springframework.context.support.ApplicationListenerDetector 详细介绍
一,功能介绍 early post-processor for detecting inner beans as ApplicationListeners 早期的PostProcessor用来检测并处理内部(inner)bean作为 ApplicationListeners BeanPostProcessor that detects beans which implement the Applica…...

MSTP实验
单点故障---冗余---环路---STP----RSTP-----MSTP MSTP 产生的背景 因为RSTP在局域网内所有VLAN 共享一棵生成树,如果链路被堵塞,将无法承载任何流量,所以为了实现流量负载均衡,MSTP诞生了。 生成树不是基于VLAN运行的ÿ…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...