我一直致力于基于MOSS(软件相似性测量)背后的学术论文实施抄袭检测引擎
链接到MOSS
对于像C / C ++ / Java这样的语言设计噪声滤波器,我有一些决定要做。
关键字是否与检测抄袭相关或是否应删除? 相同语言的源文件必须共享同一组关键字。本文没有讨论如何处理它们。
如何处理标识符? 用单个字符'V'替换所有关键字使匹配独立于变量名是有意义的。
如何处理包导入和库包含?
空白,纪念和标点肯定会被删除。
我想知道在完成所有操作后,源文件只会是一堆'V'和其他一些乱码文本。
噪音滤波器应执行哪些操作?
有关处理噪音的最佳方法的见解和意见?
答案 0 :(得分:1)
对于单个函数:编译它们,并比较生成的汇编程序代码或对象。 对于整个程序:对所有函数执行上述操作并创建模糊搜索以在已知函数和片段的数据库中找回片段。
所以基本上,你需要构建一个编译器,它会发出它的输入的canonised表示,类似于P代码,但最好是人类可读的。
某些片段比其他片段更具特色,片段
for (i=0; i < 12345; i++) {
array[i] = 54321;
}
可能会在每个程序中以某种形式出现。它的功能与
完全相同j=0;
while ( j < 12345) {
foobar[j++] = 54321;
}
,编译器可能会产生相同的代码。
变量名,数值常量,地址常量,任何东西都可能存在差异。但关键字( - &gt; {比较,循环,表达式,赋值,函数调用})的“骨架”将是相同的。所以:不要删除关键字,它们是程序的脚手架。
答案 1 :(得分:0)
如果你搜索“文字指纹木瓦”,谷歌上有很多东西可以找到。木瓦是一个x字(许多研究项目中x = 7)。你逐字逐句建立了一套所有的带状疱疹。
您在木瓦上构建哈希,然后比较文本中的1000个带状疱疹。这很简单。有一些事情,比如特殊的哈希函数,你肯定没有在这种情况下听到等等。
从阅读开始,例如,它不是真正的火箭科学,但也不是微不足道的。
“高效率的文本原点检测”Besnik Fetahu,Andreas Frische http://resources.mpi-inf.mpg.de/d5/teaching/ws10_11/hir/reports/BesnikFetahu.pdf
“重复文件的算法”,Andrei Broder http://www.cs.princeton.edu/courses/archive/spr05/cos598E/bib/Princeton.pdf