一、背景与目标

我们业务维护了两个代码仓库,两端的代码很多都是一个平台先开发好,几乎直接copy到另一个仓库。于是产生了一个技术需求,实现这两个仓库代码复用。在技术预研阶段,需要统计早先copy的代码文件有多少,提前预估双端代码的大概可复用文件比例。早先我是利用Beyond Compare 手动遍历文件,依据“肉眼”去对比的,花了大概一天的时间,而且估计的数据比较粗略。考虑到这个工作以后还会碰到,而且这个过程就是纯粹机械的文件“相似度”对比,所以期望这个过程可以采取自动化脚本完成。大家都经历过论文查重,主流的有PaperPass、中国知网等;不同的是,我要做的是一个批量文件的对比,当然它的每一步其实是两个文件之间的相似度比较。之前有人推荐我用simian等工具,很短时间就能完成对比,可以设定相似代码行数的阈值,并且可以输出相似代码。我觉得这款工具的确是好,但是毕竟是第三方工具,算法不可控,还收费。而且我们重复的不仅有代码,还有重复图片。

二、算法的设计

大家在学校论文查重时,应该用过至少听说够PaperPass。PaperPass文件比对是以句子为单位检测的,它的对比过程大致是文本预处理、语义挖掘、深度识别、全局扫描等,如下:

当然,具体还会涉及文字颜色、大小的比对,比较复杂。我们来看一下PaperPass的处理大致过程:t是要对比的文章,T是PP的论文库,S是重复计数器,M是分割后的t的string数据大小:

然后开始遍历查找,具体操作状态如下:

查找到则S=S+1,否则,t数组继续遍历,

直到t数据遍历完,循环结束。

那么t文章的相似比例为2/3。

但是这样的算法对于代码比对来说,有下面两个问题:

1、PP是以句子为单位检测的,但是代码不是简单的句子分隔,如下:

2、既然代码文件不能按语句分隔,该如下结合代码copy场景找到最佳的分隔单位呢?是按空格、还是按行呢?

实际copy常常会因人习惯不同,增加些个人习惯的换行,尤其“左大括号换行派”与不换行派的互相copy代码的时候有一定的误差;我们来看看按空格分隔,分隔后的数组示意图如下:

根据这个分隔原理,我用ruby脚本憝了这个算法,并验证了下算法的情况,如下:

三、工具的原理

上面内容已经基本验证了按空格分隔的效果,根据PaperPass的过程,写了一个完整的工具,进行扫描:

我可以根据工具进行灵活性调整,筛选出相似比超过90%的文件或者其他。

四、算法的不足与改进

这个小工具的目的本身就是为了方便自己使用,出发点也没打算做的很牛逼,没有花过多时间去改进它,但是还是有很多方案可以改进这个算法提升比对效率的:

1、由于算法的比对以及遍历工程目录下的文件时,使用的都是“暴力”循环遍历,时间复杂度较高,我最高比对库代码达到7000个.m文件,脚本执行了一天没跑完;后来执行时,去除了不必要的底层pod代码库,只对比了业务层的代码,发现不到2小时,就跑完了。

2、中间也提过,如果你不想那么精确地比对,可以按单行进行分隔,或者按多行为分隔单位。

3、原子算法的复杂度是O(n2)的,如果再想着优化,就要优化原子算法本身了。对于T1文件与T2文件的比对过程中,如果发现T1中的某一行在T2中找不到重复的(这种情况应该是较大概率的),可以对T1针对这一行进行一次去重处理O(n);如果这一行在T2中找到了,去重处理并且计数器S累加。如果想把复杂度降到O(nlogn),那么恐怕要采取二叉树这样的数据结构去处理T2了。

4、针对代码文件,我们发现前面几行文本往往都是很相似的,这些文本的对比会影响代码内容的相似度的精确性,例如:

我们也可以直接过滤掉这些代码段。

文件相似度比对工具的设计与实现相关推荐

  1. C++ 项目实战:跨平台的文件与视频压缩解压工具的设计与实现

    C++实战:跨平台文件与视频压缩解压工具的设计与实现 一.引言(Introduction) 1.1 项目背景与目标 1.2 技术选型:C++.FFmpeg.libarchive.libzip.Qt C ...

  2. kettle工具的设计原则

    Kettle工具在设计初,就考虑到了一些设计原则.这些原则里借鉴了以前使用过的其他一些ETL工具积累下的经验和教训. 易于开发:作为数据仓库和ETL开发者,你只想把时间用在创建BI解决方案上.任何用于 ...

  3. 推荐一些能提升工作幸福度的小工具

    盘点那些真正能提升工作幸福度的小工具,都是我日常开发中经常使用的工具.包括4个维度:软件.终端.VScode插件.Chrome插件. 软件篇 Alfred 官网:www.alfredapp.com/ ...

  4. 盘点那些真正能提升工作幸福度的小工具

    盘点那些真正能提升工作幸福度的小工具,都是我日常开发中经常使用的工具.包括4个维度:软件.终端.VScode插件.Chrome插件. 软件篇 Alfred 官网: www.alfredapp.com/ ...

  5. 远程管理linux系统工具,远程管理Linux系统工具的设计与实现Linux013

    一种远程管理Linux系统工具的设计与实现 摘  要 现在,Linux已经是应用比较广泛的操作系统之一,在其系统中有很多的服务.为了实现远程配置和管理Linux中的各种服务,需要有一种远程管理Linu ...

  6. 【C 语言】文件操作 ( 配置文件读写 | 业务逻辑 | 接口设计 )

    文章目录 一.配置文件读写 业务逻辑 二.接口设计 1.写文件接口 2.读文件接口 3.修改文件接口 4.接口合并 一.配置文件读写 业务逻辑 开发一个系统 , 在命令行中实现如下功能 , 通过命令操 ...

  7. 查找重复文件_重复文件查找和磁盘整理工具:Tidy Up

    为大家带来一款实用的重复文件查找和磁盘整理工具,Tidy Up 5 for Mac可以用来快速查找重复文件并整理硬盘,tidy up 5 mac特别版会根据文件的种类组织分离找到项目,非常的好用. t ...

  8. 一个图形数据维护工具架构设计

    一个图形数据维护工具架构设计 1.背景 近期负责一个GIS矢量化项目,工程中涉及图形数据.GIS业务数据的关联存储和管理.为弥补图形矢量化软件在附属属性管理方面的局限性,采用两套数据库系统进行图-数关 ...

  9. 基于FME的地形图图面压盖检查工具的设计与制作

    基于FME的地形图图面压盖检查工具的设计与制作 程丽萍 (1,2.昆明市测绘研究院,云南 昆明650051) The Design and Implementation of  FME-based T ...

  10. 【高级Java开发】类QQ聊天工具的设计与实现(代码已上传)

    1.要求 类QQ聊天工具的设计与实现,要求如下: 用户可注册并通过密码录登. 用户可通过查找添加自己的好友. 用户可通过好友列表选择好友并与之对话. 需实现聊天记录查看功能. 界面美观大方,交互设计尽 ...

最新文章

  1. 关于物理像素/逻辑像素
  2. 美团悄悄进入企业早餐,其战略目的为高频带低频?
  3. python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...
  4. 间歇性掉帧卡顿_电脑卡顿问题靠它解决,我只能帮你到这儿了
  5. drupal 使用补丁_使用Drupal解决大学需求
  6. H264/SVC Temporal Scalability
  7. python操作文件open_【转】PYTHON open/文件操作
  8. java框架的作用_java三大框架的作用介绍
  9. 三极管的基础知识(下)①
  10. linux filesystem not open,建立物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录...
  11. Python 中文数字对照表 输入一个数字,转换成中文数字。比如:1234567890 -> 壹贰叁肆伍陆柒捌玖零。【简单易懂,代码可以直接运行】
  12. 对于幸福不是悖论的证明,在现代对于幸福探寻
  13. 《wireshark》怎么抓包
  14. fastadmin 百度编辑器无法上传图片的几种原因和修改方法
  15. IC设计之CDC(跨时钟域)问题
  16. codewars练习(javascript)-2021/2/18
  17. 戴尔笔记本提示“您已插入低瓦数电源适配器 在bios设置中可以禁用此警告”
  18. 人工智能+智能运维解决方案_如何建立对人工智能解决方案的信任
  19. 基恩士KV7500,KV8000轴控制FB模板,直接可以拿来用,使基恩士编程也随心所欲
  20. Lanczos 重采样

热门文章

  1. kux格式怎么转换成mp3_怎么把kux格式转换mp4、mp3?视频转换技巧介绍
  2. 【JAVA】每日练习——02
  3. 涉案千万,抓获170人,从业者多为90后,广州一公司被一锅端了!
  4. 静态代理和动态代理原理及实现
  5. 游戏夜读 | 游戏关卡设计师
  6. Spotfire10.10.0 windows10安装与配置
  7. 物联网通信技术-概述
  8. 微信小程序登陆注册功能实现
  9. java银行存款案例
  10. 【推荐】智慧应急指挥调度中心信息化软件平台管理系统建设解决方案合集(共46份,790M)