| 這個作業屬於哪個課程 | <信安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文件在其后面直接攜帶參數
