设为首页 - 加入收藏
您的当前位置:主页 > 365bet体育在线 > 正文

一种检测抄袭的指纹算法

来源:头条 编辑:小编 时间:2019-01-17
   过去两周,在学生实验室的改革中,据说许多人直接在github上复制代码,并使用了Naruil之前编写的剽窃检查软件。 这感觉非常有效,而且肯定是TA的利器。 然而,尽管检查剽窃非常方便,但编写配置文件和键入订单将会结束。 然而,以后会有更多的麻烦要处理。 回复一堆学生的电子邮件需要很多时间然后我们在每个窗口中选择最小值 因此,建议助教们少做些检查剽窃的工作确实是一项吃力不讨好的工作此时,我们只需要在这个散列第一次出现的窗口中选择它,其他窗口不再需要选择最小值然后使用winnowing算法在每个窗口中选择最小的哈希值    谈到这一点,事实上,我前年写的一篇博客提到了Naruil的剽窃检查算法,但当时主要是关于TCP冗余,它还使用了指纹算法 在那篇博客中,还提到了由Lua编写的Naruil剽窃检查软件实际上是基于Sigmod ' 03的一篇论文: Winnowing 今天,根据这篇论文,我将介绍指纹算法,以及Naruil如何将其应用于剽窃检查。    首先,根据Winnowing作者的经验,检查剽窃的算法必须满足以下三个条件:    不得受字符或标记的影响,如“空格”、字母大小写、标点符号(以及检查代码时的变量名和函数名);    一些短单词对整个算法的影响必须被忽略,例如,两个文档中都有许多“The”,但实际上这没有任何意义。    它必须是“位置独立的”,也就是说,它不会受到影响,因为一些“子字符串”已经通过改变文档中较低“子字符串”的顺序而被添加或减少。    指纹算法解决了这三个问题!    首先,让我们描述最常见的指纹算法之一: k - gram。文档的字符串被分成长度为k(k是可选参数)的子字符串集( k - grams ),然后这些子字符串被分别计算为哈希值,然后从所有这些哈希值中选择一个子集,这个子集是该文档的指纹。    例如:    字符串:    让我们首先删除一些不相关的字符(如空格),并将其更改为:    然后它被分成长度为k的子串(假设这里k是5 ) :    然后通过哈希算法将这些子字符串计算为哈希值:    然后问题变成了“如何选择所有哈希值的子集”,也就是说,如何。最极端的方法是选择所有的哈希值,但是这将把原来的n个字符变成计算字符数,这将产生大量的计算。    另一种以前更成熟的算法被称为从这些哈希值中选择值0。例如,对于上述示例,您可以选择,然后选择的哈希为:    该算法的优点是:对于某个值,它的实现非常简单,基本上可以采样出哈希值。然而,它有一个缺点,那就是它不能保证在两个文件的某一段中的重复可以被发现。这是什么意思? 假设对应于文档内容的两个选定哈希值之间的距离被称为“间隙”,那么这个“间隙”的最大值是无限的! 换句话说,通过这种方法,我们不能保证选择了由“gap”t内的文本生成的散列。    我不知道我是否已经说清楚了,如果仍然存在问题,那么更具体地说:假设我们有一个包含105个字符的文档d,采用k - gram算法,取值为6,那么它将生成一个哈希值,文档d有5个段落p1,p2,p3,p4,P5,假设使用该算法,p取值为10,那么这个哈希值很可能只分布在段落p1,p2,P4,P3和P5中没有选择哈希值。虽然这种可能性不大,但我们不能保证p1~p5段落有选择的比较值。    事实上,还有一种示例方法,一次选择最小的N个哈希值。这种方法实际上非常有效,但是它的缺点是,如果我们比较包容的情况,也就是说,类似于一个文档包含另一个文档的情况,这将是有问题的。即使我们根据生成的哈希值数量的比例选择最小n个值,例如,文档a生成100个哈希值,文档b生成50个哈希值,然后我们选择文档a中的最小10个值和文档b中的最小5个值,仍然不能保证在文档a中选择的10个哈希值中,有对应于文档b的子文档的哈希值(因为较小的哈希值可能分布在文档a的其他段落中)。    关于k -克指纹。指纹算法可以满足剽窃检测系统的前三个要求:。它将删除一些不相关的字符(如空格等)    )以避免它们对结果的影响 。对于小于k的子串,它不会计算散列,因此不会影响结果    它不需要依赖于位置,如果获得的哈希值都是样本,也将检查不同位置相同k长度的子串 。。    接下来,我将讨论这篇文章的算法——风选    。。风选也是一种K - gram算法。不同之处在于它的示例哈希方法,它解决了在中遇到的问题    它的方法其实很简单:。仍然使用上面给出的示例,获得的哈希值为:。    假设我们希望检测到t个字符内的任何重复(不包括t ),那么我们设置一个窗口。    例如,在上面5克的例子中,如果我们想要t=8,那么我们就设置它,这样我们会得到下面14个哈希值的窗口:。    这里应该注意的是,几个连接窗口的最小值可能指文档中的相同散列。    例如,在这个例子中,前三个窗口的最小值都是17,指向同一个散列,所以我们只需要选择第一个窗口,在第四个窗口中出现另一个17之前,我们不需要选择另外两个窗口。通过该算法,我们可以对以下5个哈希值进行采样:。这是整份文件的指纹    这里选择每个窗口的最小值的原因是可以获得许多相同的值,因此最终获得的指纹的散列数更少    例如,上面获得的5个散列值中有3个是重复的。如果申请要求与位置无关(如后面提到的剽窃检查程序),在最终检查过程中,3“17”可以变成1“17”,整个指纹可以变成:    很容易看出,由该示例算法选择的指纹能够满足其要求:。如果在T长度的任何字符内有重复(不包括T ),它可以获得它的一个K长度子字符串的指纹并检查它。任何小于k长度的噪声子串都不会影响结果。。。接下来,让我们来谈谈Naruil是如何使用风选算法来检查剽窃的:   因为它是为了检查C/C++代码的剽窃,所以对于任何需要检查的文档,应该使用语义分析器来更改所有关键字、变量名、函数名等。变成记号(这里的记号实际上是不同的数字),然后是空格、注释、标点符号和支持代码等。应该被移除。在前一步中,任何文件都被更改为长度为n的标记字符串,然后选择k值( Naruil选择了7,据说这是几个实验的结果)    令牌串被分成长度为k的子令牌串:    将这些子令牌串分别计算成散列值;。    选择一个窗口值( Naruil选择5 ),并将上一步计算的哈希值按顺序填入每个窗口;。    从这些选定的哈希值中删除重复项,得到的哈希值就是该文件的指纹    最后,比较每个学生的相同文件的指纹,并且获得任意两个文件的相同哈希值的比率,这是两个学生的文件重复率。。。通过该算法得到的结果相当好。    如果你看看重复率超过70 %的学生的代码,你会发现他们中的大多数人都能清楚地看到剽窃的痕迹,也就是说,改变变量名,改变函数的顺序,等等。。          。    。    。    。。

相关文章:

相关推荐:

栏目分类

365bet体育在线

Top