如何验证是否从Web复制源代码

时间:2012-08-20 05:54:17

标签: security checksum sha code-access-security

我正在构建一个Web工具来检查提交的内容是从Web获取还是提交者自己的工作。抄袭探测器。

我知道我可以生成校验和并将其用作与其他条目进行比较的键。但是,如果有人做了一些小改动,比如包括/删除注释,更改变量/函数名等等,那么校验和将会有所不同,所以这种方法不起作用。

有关更好方法的任何建议吗?

2 个答案:

答案 0 :(得分:8)

Plagiarism detection是相似性检测的特例。这是一个很大的研究领域,几乎和计算机科学一样古老。已发表研究的很多,并没有一个简单的答案。

请参阅,例如a Google Scholar search for "code similarity plagiarism""plagiarism detection"。定期Google搜索"source code similarity detection algorithm"之类的内容也很有用。

这个空间里还有很多existing tools,所以我很惊讶你是想写自己的。{/ p>

正如您所指出的,除非代码完全相同,否则校验和将无法完成工作。可以提供帮助的技术包括:

  • 构建字频直方图并进行比较

  • 使用text-substring matching

  • 提取评论文本并查找复制的评论
  • 提取变量,类和方法名称并查找使用相同名称的其他代码。您必须对每个人都会选择的“明显”名称以及由问题决定的名称(如实现特定接口或API)进行大量更正。私有类成员变量和函数或方法中的局部变量是最有用的比较。您将需要编译器的帮助或至少语言的语法分析器来提取这些。

  • 寻找缩进风格的差异。用户是否使用了全空格缩进,除了这一个用标签缩进的函数?

  • 比较解析树或令牌流以消除格式化的影响。您通常需要比较各个函数等,而不仅仅是代码作为一个整体。

  • ......还有更多

你需要做的是制作一份报告,权衡所有这些因素和其他因素,并将它们呈现给人类,以便人类做出决定。您的工具应该解释为什么它认为两个结果相似,而不仅仅是它们相似。

答案 1 :(得分:0)

我如何理解这一点,最近可以添加自定义增强功能:

删除所有非字母或数字的内容;

使用带有空格字符的explode()作为分隔符并查找所有单词;现在你知道那篇文章中有多少单词;

现在,你必须找出该文章中出现的单词的次数,并在每次在文本中找到该单词时增加单词指示符;

将其存储到数组中,例如:

$words['wordX']++;

请同时使用您要查看的第二篇文章;

现在,比较一下;你知道原始数据;在这一步可以得出一些结论;

使用像约翰的J这样的大字,来自封建主义的F,你也可以得出一些结论;

从这里你可能知道文章是否是同一件事,这可能是真正的一步#1

现在,不知何故,你必须在同一时间逐字逐句地解析这两篇文章,并看到它们之间的差异。

学生可以在原始文章中找到的每个句子/段落后添加自己的“原始”句子。

确保如果你在其中一篇文章的解析过程中取得很大进展,你就会以某种方式保持平衡的解析过程并尝试解析第二篇文章,直到达到平衡。

我看到2个for指令,可能是3个,或者是3个,这个函数试图在解析过程中保持平衡。

此外,您必须使用explode()并逐句检查,并逐句逐句查找相似度。

我相信你明白了,但我再说一遍,你无法解析整个WWW。