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

rsp*_*spr 6 security checksum sha code-access-security

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

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

有什么更好的方法吗?

Cra*_*ger 8

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

例如,参见Google Scholar搜索"代码相似性抄袭""抄袭检测".定期谷歌搜索"源代码相似性检测算法"之类的东西也很有用.

这个空间里还有很多现有的工具,所以我很惊讶你正在尝试编写自己的工具.

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

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

  • 使用text-substring匹配提取注释文本并查找复制的注释

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

  • 寻找缩进风格的差异.用户是否使用了全空格缩进,除了这一个用制表符缩进的函数?

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

  • ......还有更多

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