一、 代码查重方法
代码查重,其实就是对源代码进行两两比对,发现重复率到了一定的阈值以上,就可以认定为抄袭。目前代码查重可以应用到学术作品(论文,计算机程序等),代码复现验证,成绩评估等。 代码查重有多种方式,如常见的 hash 值法,编辑距离法,结构化程序分析法,规则匹配法,文法分析法,特征向量法等。 1. Hash 值法
把每一段代码都算出一个 hash 值(比如 MD5, SHA-1 等),然后将代码两两比较,比较 hash 值的差异。如果 hash 值相同,那么这两段代码很可能是一样的;如果 hash 值不同,则说明代码不一样。
这种方法比较快,但是很容易出现误判,因为 hash 值有可能即使代码不一样,也会有相
同的 hash 值,导致误判为相同代码;另外 hash 值有可能会因为改动一些没有影响代码实际功能的东西(比如空格之类的)而发生变化,也可能导致误判。
代码转换 2. 编辑距离法
编辑距离法是在字符串比较中应用的经典算法,其原理是把一个字符串转换成另一个字符串所需要的最少操作次数。可以将代码拆分成一个个字符,然后按照编辑距离算法进行比较,计算出相似度最大的以作为抄袭的比较结果。
3. 结构化程序分析法
结构化程序分析法指的是将代码的结构作为分析的依据,而不是简单的比较字符串,去寻代码间的相似度。根据代码的语言特征来把原始代码转换成抽象语法树,然后比较两棵抽象语法树,计算其相似度,来判断是否有抄袭现象。 4. 规则匹配法
规则匹配法指的是把代码映射成一项“规则”,然后根据规则与其它程序进行比较,判断是否相同。
5. 文法分析法
文法分析法是指将代码解析成文法组成单元,再去比较文法组成单元之间的相似度,从而判断源代码之间是否存在重复。
6. 特征向量法
特征向量法是把代码映射成一个特征向量,然后计算两个特征向量之间的距离,比较其大小,来判断彼此之间是否存在重复现象。