这个作业属于哪个课程 | <信安1912-软件工程 (广东工业大学 - 计算机学院)> |
---|---|
这个作业要求在哪里 | <个人项目作业> |
这个作业的目标1 | <熟悉使用GitHub、Markdown语法> |
这个作业的目标2 | <完成PSP表格记录> |
这个作业的目标3 | <锻炼个人打码能力> |
文章导航
代码链接(Golang)
- 写在前面的话:本次作业原本的要求为使用c++、Java、Python中的一种语言进行程序的编写,但是由于本人目前正在进行区块链的学习,仅能熟练地使用Golang语言,故而本项目为Golang语言编写(已在取得老师的允许下使用Golang语言)
- GitHub链接
- 可运行的exe文件已发布至仓库的release包内
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 45 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 45 |
Development | 开发 | 180 | 345 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 20 |
· Design Spec | · 生成设计文档 | 15 | 30 |
· Design Review | · 设计复审 | 15 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
· Design | · 具体设计 | 20 | 50 |
· Coding | · 具体编码 | 60 | 150 |
· Code Review | · 代码复审 | 15 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 45 |
Reporting | 报告 | 75 | 85 |
· Test Repor | · 测试报告 | 15 | 20 |
· Size Measurement | · 计算工作量 | 10 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 50 | 50 |
· 合计 | 285 | 475 |
计算模块接口的设计与实现过程
整体流程
- main函数会接收到三个参数
- 将两个等待对比的文本内容分别转换为字符串数组
- 将字符串先进行哈希运算
- simhash函数计算两者之间的海明距离
- 再计算两者之间的相似度
工程分包的截图
一共有两个包:main(主函数所在的包)、utils(工具函数所在的包)
1、整体流程
2、函数方法
- main函数:主函数
- Simhash函数:计算simhash值(核心算法)
- Hash函数:md5加密哈希文本
- HammingDistance函数:计算海明距离
- Similarity函数:相似度计算
3、核心算法
simhash+海明距离
参照simhash流程图:
性能分析
此处使用的性能分析工具是golang自带的pprof,因此需要在原本代码的基础上进行一些修改
这是针对CPU进行的一个性能分析
在图中不难看出,在本程序中运行时间最长的函数方法为simhash
因为在simhash中既完成了文本的切割
又完成了md5的哈希加密,因此运行10ms,也是属于正常范围
因此性能上基本不需要进行改进
单元测试展示
- 读写模块测试
- 基本思路:
- 1、测试正常读取
- 2、测试正常写入
- 3、测试错误读取
- 4、测试错误写入
测试结果如下图所示,运行时间为230ms,代码覆盖率为100%
- Simhash模块测试
测试结果如下图所示,运行时间为243ms,代码覆盖率为92.25%
此处的代码覆盖率无法达到100%:
- 1、一部分原因是文本输入出错代码方法未设计
- 2、另一部分原因是simhash内部循环回避
- 海明距离以及相似度模块
因为此处的函数实现均为数学运算,本人认为较容易达到100%的代码覆盖率,故而没有进行测试
异常处理说明
首先介绍一下异常处理保护模块Protect
这是一个异常处理机制,可以捕获异常,类似于Java中的try/catch
有两个地方应用到了该保护机制
第一处在文本读取的模块,针对此处进行测试,如下对应的错误已经捕获
第二处在文本划分模块,如果划分的文本为空,也会导致错误,针对此处进行测试,如下对应的错误已经捕获
测试
写在最后面的话
首先需要对老师进行道歉
由于本人个人原因,仅能使用golang对作业进行程序编写,给老师添麻烦了
其次就是由于时间原因本程序的实现还不是特别完善
- 对代码的审计查重还无法实现
- 输出时会对上一次记录进行覆盖
- 由于golang设计时不允许main函数带参数和返回值,因此无法对exe文件在其后面直接携带参数