rsp*_*spr 6 security checksum sha code-access-security
我正在构建一个Web工具来检查提交的内容是从Web获取还是提交者自己的工作.抄袭探测器.
我有一些想法,我可以生成校验和,并将其用作与其他条目进行比较的关键.但是,如果有人做了一些小的更改,比如包括/删除注释,更改变量/函数名等等,那么校验和将会有所不同,所以这种方法不起作用.
有什么更好的方法吗?
抄袭检测是相似性检测的特例.这是一个很大的研究领域,几乎和计算机科学一样古老.有很多已发表的研究,并没有一个简单的答案.
例如,参见Google Scholar搜索"代码相似性抄袭"或"抄袭检测".定期谷歌搜索"源代码相似性检测算法"之类的东西也很有用.
这个空间里还有很多现有的工具,所以我很惊讶你正在尝试编写自己的工具.
正如您所指出的,除非代码完全相同,否则校验和将无法完成工作.可以帮助的技术包括:
构建词频直方图并进行比较
使用text-substring匹配提取注释文本并查找复制的注释
提取变量,类和方法名称以及查找使用相同名称的其他代码.您必须对每个人都会选择的"明显"名称以及由问题决定的名称(如实现特定接口或API)进行大量更正.私有类成员变量和函数或方法中的局部变量是最有用的比较.您将需要编译器的帮助或至少语言的语法分析器来提取这些.
寻找缩进风格的差异.用户是否使用了全空格缩进,除了这一个用制表符缩进的函数?
比较解析树或令牌流以消除格式化的影响.您通常需要比较各个函数等,而不仅仅是代码作为一个整体.
......还有更多
你需要做的是制作一份报告,权衡所有这些因素和其他因素,并将它们呈现给人类,以便人类做出决定.您的工具应该解释为什么它认为两个结果相似,而不仅仅是它们相似.