CN112579155B - 代码相似性检测方法、装置以及存储介质 - Google Patents
代码相似性检测方法、装置以及存储介质 Download PDFInfo
- Publication number
- CN112579155B CN112579155B CN202110198641.2A CN202110198641A CN112579155B CN 112579155 B CN112579155 B CN 112579155B CN 202110198641 A CN202110198641 A CN 202110198641A CN 112579155 B CN112579155 B CN 112579155B
- Authority
- CN
- China
- Prior art keywords
- similar
- fingerprint
- hash
- source code
- files
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
- G06F8/751—Code clone detection
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Collating Specific Patterns (AREA)
Abstract
本发明实施例涉及软件检测领域,公开了一种代码相似性检测方法,主要分为三个阶段,预处理阶段对海量源代码文件进行预处理和特征提取工作,输出相似哈希指纹值;指纹索引阶段则根据上一阶段的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配;相似匹配阶段则在对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果;本发明能够从不同语言常见行的消除这一角度出发来降低行覆盖问题对结果的影响。
Description
技术领域
本发明涉及软件检测领域,具体为一种代码相似性检测方法及***、装置以及存储介质。
背景技术
现如今,随着软件代码开源化的日益普及,开源代码量正以光速增长。无论是在企业还是科研单位,越来越多的开发者选择拷贝粘贴已有代码以提高软件开发效率。然而,随着软件不断更新,软件功能不断增加,这些重复代码和克隆代码对软件质量、可用性和可维护性的负面影响愈发突显。从开源项目引入的代码降低了软件开发人员对软件***整体的理解和把控,外来代码与软件***本身代码之间可能会出现冲突,开源代码中的漏洞也可能会随着代码拷贝被引入到项目中,带来安全隐患。针对此问题,研究人员通常使用代码相似性检测技术来检测软件工程中的相似代码。
自20世纪70年代起,学术界涌现了大量的代码相似性检测工具和方法,广泛应用于代码克隆检测、软件许可证违反检测、软件抄袭检测、漏洞缺陷发现等方向。目前常用的代码相似性检测方法包括:基于指标(metrics-based)、基于文本(text-based)、基于词法(token-based)、基于树(tree-based)和基于图(graph-based)五个层次。 随着开源代码量的不断增加,代码相似性检测的大规模化已成为必然趋势。传统的方法在小规模的数据情景下能够获得比较高的精度,但在有限的硬件条件下,若需要对被测代码进行字符串比较或进行基于词法、语法、语义的分析,再与库中大规模数据进行比对,将会消耗过量的时间。
相似哈希最早由Charikar等人提出,是一种局部敏感哈希LSH(local Sensitivehash)算法。对于传统哈希算法来说,其产生的数字签名结果仅仅提供原始输入相等或是不相等的信息,当输入不相等的情况时,无法额外提供其他内容。即便只对输入内容修改一个空格,也极大可能产生截然不同的签名信息。而通过相似哈希算法,两个源代码文件获取的Simhash指纹不仅仅能表达两者是否相等,还能够记录他们的相似程度。
由于Simhash相似检索的高效性,它在很多领域均有广泛应用。谷歌曾将Simhash用于海量相似网页去重,他们移植的算法在谷歌爬虫爬取的数十亿量级的网页数据库中上获得了较好的测试效果,并被谷歌应用到实际产品中。在克隆分析领域,同样也有Simhash的身影。Uddin等人曾结合Simhash和Nicad两种方法提出了SimCad这一代码克隆簇聚类工具,Qiao等人也曾将Simhash用于汇编代码同源检测中。
由于代码中经常会出现重复词,以词粒度来获取代码相似哈希特征容易出现高频的特征把低频的特征覆盖掉的现象,有人提出以代码行为粒度进行特征累加,并且在预处理中筛除了纯符号行和空行,对相似哈希在代码检测方面的应用做了进一步改进,如图1所示,其算法流程大致如下:1)将输入代码文件进行预处理和分行,筛除纯符号行和空行;2)对于每一行,使用传统的哈希方法获得一个指定位数的签名值;3)对于每一个特征的每一位,假如该位为1,则将其置为其权重值,若该位为0则置为其权重的相反数;4)将每一个特征都逐位相加,得到一个结果向量;5)降维,将结果向量的每一位进行置换,正数置换为1,负数置换为0,即可得到最终的指纹值。
经过实验分析和统计,发现现有的相似哈希方法在实际工程上存在高频行特征对低频行特征的覆盖问题,导致结果精确度极低,行覆盖现象主要出现在以下几种情况:
在代码中频繁出现的一些包含关键字的代码行,例如“break”“return;”“try{”。在某些情境下,这些行出现的频率非常高以至于它对结果的影响覆盖了所有其它行的影响。
由于代码功能的特殊性(如一些表示信息提示的工具类或测试类),在代码中会频繁出现一些功能性行内容,例如对某一种方法的频繁调用、在多个方法里实现传递同一信息的功能等。
在以上两种情况中,后者的覆盖现象可以视作是文件代码功能单一性的体现,所以具有大量重复相同方法的两个相似代码文件对不算作在代码相似度量过程中的误报。第一种情况中的注释和某些代码行的大量出现不能特征性地代表代码文件的功能,因此会对结果的准确性带来较大影响。
针对行覆盖现象,如果单纯将文件里频繁出现的行的权重降低,可能会将第二种情况中重复调用方法的行对指纹的影响减弱,无法体现文件的特殊功能,造成此类文件的漏报。
发明内容
本发明的目的在于提供一种代码相似性检测方法,能够从不同语言常见行的消除这一角度出发来降低行覆盖问题对结果的影响。
为解决上述技术问题,本发明的实施方式提供了一种代码相似性检测方法,包括如下步骤:
S101:预处理阶段,对海量源代码文件进行预处理和特征提取工作,输出相似哈希指纹值;
S102:指纹索引阶段,根据所述预处理阶段的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配;
S103:相似匹配阶段,对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果。
优选地,步骤S101包括如下子步骤:
S1011,代码预处理:所述源代码文件的代码中包括无关因素,所述无关因素包括空行、空格、注释,将代码进行统一的格式化处理,去除所述无关因素;
S1012,特征提取:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征;
S1013,散列处理:使用散列算法,将源代码文件的每一个特征计算出一个对应的散列值,所述散列值为64位的二进制数串;
S1014,加权求和:以每个特征出现的频次作为特征的权重进行加权求和,散列值每一位的0或者1决定了其与权重值是正相乘还是负相乘,将加权后的每一个散列值逐位相加即可得到结果序列串;
S1015,降维:对加权求和获得的结果序列串进行变换,对每一位若为正数则变换为1,否则变换为0,得到最终的相似哈希指纹值。
优选地,步骤S102中,将每个指纹分成5段,并通过排列组合将其重组作为索引分别记录在相似哈希指纹库的字段中。
优选地,步骤S103中,首先,与预处理阶段对应,对待测工程文件进行标准化、特征提取以及相似哈希指纹生成的操作;然后,与指纹索引阶段对应,将待查询的相似哈希指纹值分成5段,两两排列组合后得到10个索引片段,分别与数据库中其对应的字段中进行精确匹配,匹配上的文件即为可能与待测文件相似的文件;最后,对所有候选序列中的哈希值作进一步的海明距离计算,并汇总最终计算出来的结果。
本发明的实施方式还提供了一种基于相似哈希算法的代码相似性检测***,包括如下模块:
预处理模块,用于对海量源代码文件进行预处理和特征提取工作,输出相似哈希指纹值;
指纹索引模块,用于根据所述预处理模块的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配;
相似匹配模块,用于对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果。
优选地,所述预处理模块包括如下子模块:
代码预处理子模块,代码中包括无关因素,所述无关因素包括空行、空格、注释,所述代码预处理子模块用于将代码进行统一的格式化处理,去除所述无关因素;
特征提取子模块,用于:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征;
散列处理子模块,用于:使用散列算法,将源代码文件的每一个特征计算出一个对应的散列值,所述散列值为64位的二进制数串;
加权求和子模块,用于:以每个特征出现的频次作为特征的权重进行加权求和,散列值每一位的0或者1决定了其与权重值是正相乘还是负相乘,将加权后的每一个散列值逐位相加即可得到结果序列串;
降维子模块,用于:对加权求和获得的结果序列串进行变换,对每一位若为正数则变换为1,否则变换为0,得到最终的相似哈希指纹值。
优选地,所述指纹索引模块将每个指纹分成5段,并通过排列组合将其重组作为索引分别记录在相似哈希指纹库的字段中。
优选地,所述相似匹配模块用于:首先,与预处理阶段对应,对待测工程文件进行标准化、特征提取以及相似哈希指纹生成的操作;然后,与指纹索引阶段对应,将待查询的相似哈希指纹值分成5段,两两排列组合后得到10个索引片段,分别与数据库中其对应的字段中进行精确匹配,匹配上的文件即为可能与待测文件相似的文件;最后,对所有候选序列中的哈希值作进一步的海明距离计算,并汇总最终计算出来的结果。
本发明的实施方式还提供了一种电子设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如前所述的代码相似性检测方法。
本发明的实施方式还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现如前所述的代码相似性检测方法。
本发明实施方式相对于现有技术而言,出于对规模和效率上的考量,在基于文本的行粒度相似哈希(Simhash)算法基础上进行了优化,提出了分语言行筛选的相似哈希检测方法。方法一方面延续了相似哈希高效相似检索的特性,将源代码预处理后映射为一个二进制数(即代码的指纹),以实现对代码文件的降维和索引,加速大规模库的构建;另一方面结合不同语言代码的特性,排除了常见行对指纹生成的影响,使得指纹结果更能够体现代码特性,大幅提高相似检测的精确度。本方法具有易于实现、部署简单、无其他词法或语法分析器依赖、构建效率高、以及语言迁移成本低等特点,与此同时其高精确度的特点保证了结果中的错误匹配对数量较低,降低了后续人工核验的成本。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除非有特别申明,附图中的图不构成比例限制。
图1为现有技术中相似哈希指纹获取方法示意图。
图2为本发明改进后的相似哈希指纹获取方法示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施方式进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施方式中,为了使读者更好地理解本发明而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本发明所要求保护的技术方案。以下各个实施例的划分是为了描述方便,不应对本发明的具体实现方式构成任何限定,各个实施例在不矛盾的前提下可以相互结合相互引用。
下面结合附图和特定的具体实例对本发明做以详细说明。
为了排除由于代码的特殊语法结构而频繁出现的一些代码行对结果的影响, 本发明选取了10种常用语言(c#、c/c++、go、java、js、php、python、ruby、sql、swift),并对每种语言分别进行常用行统计。数据源选自github星数排名前50000的开源项目,将其中每种语言的源代码文件进行预处理后按出现频数降序排列,取前20000行作为该语言行筛选器的筛选内容。其中部分语言的常见行统计前15名结果如表1所示
表1 分语言常见行统计结果
从表1中可见,在代码文件中频繁出现的行不仅包含纯符号行,也包含一些特殊的与语义相关的行,这些行在代码中的频繁出现并不能直接地体现代码功能,包含的语义信息也较少,因此并不属于上文中提到的频繁出现一些功能性行内容的行覆盖情况。若仅通过纯符号行对结果进行筛选,其余频繁出现且特性体现较低的行就会影响指纹特征的提取,比重较大时将出现行覆盖的情况,严重影响结果的精确度。同时,尽管不同语言之间有一些通用的常见行如“returnfalse;”“}else{”“return”等,由于不同语言的语法特点不同,其常见行列表之间差异性也较大,存在一些语言特有的常见行如python中的“pass”,ruby中的“ensure”等。
由此,本发明在行粒度相似哈希算法的基础上进行了改进,如图2所示,对于待测源代码进行去空行、去注释、去空格、全部大写转换为小写的预处理过程,并将代码文件分行。根据文件的后缀名判断所属语言,从常见行库中选取对应语言的常见行列表作为筛选器,将文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为该代码文件的特征。通过MurMur Hash方法对这些特征依次进行哈希计算,并将得到的结果逐位映射为一串由1、-1组成的序列,最后经过累加和降维得到最终的指纹结果。
本发明公开的方法主要分为三个阶段,预处理阶段、指纹索引阶段、相似匹配阶段。预处理阶段对海量源代码文件进行预处理,接着进行特征的筛选和提取,最终生成相似哈希指纹。指纹索引阶段则根据上一阶段的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配。相似匹配阶段则在对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果。
以下对本发明提出的方法与***作进一步描述。本发明实施例的所述方法可以由各类智能计算设备中的处理器来执行,具体的,本发明实施例的所述方法包括如下步骤:
S101,预处理阶段:
预处理阶段对海量的源代码文件进行一些预处理和特征提取工作,输出指纹值。改进后的相似哈希指纹获取方法如图2所示,包括如下子步骤:
S1011,代码预处理:代码中一些无关因素如空行、空格、注释等会影响生成的哈希结果,为了提高相似性匹配结果的精确度,将源代码进行统一的格式化处理,对于待测源代码进行去空行、去注释、去空格、全部大写转换为小写的预处理过程,去除这些无关因素。
S1012,特征提取:为了排除一些大量出现且无意义的行对结果的影响,预先通过对10种常用语言的github星数排名前50000的开源项目文件进行常用行统计,并以每种语言按频次排序的前20000行作为常见行列表。根据文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将文件中包含在筛选器中的对应行全部筛除,剩下的代码格式化后的每一行作为该源代码文件的一个特征。
S1013,散列处理:使用传统的散列算法MurMurhash,将源代码文件的每一个特征计算出一个对应的散列值,所述散列值是64位的二进制数串,参见附图2,截取其中8位二进制数串进行演示。
S1014,加权求和:以每个特征出现的频次作为特征的权重进行加权求和,获得结果序列串。如S1012~S1013中描述,我们把每一行看成一个特征,每个特征计算出一个对应的散列值,相同的行对同一个文件来说是同一特征的重复出现,对文件内的每一行进行出现次数的统计(相当于是不同行的set),对每一行来说,该行重复出现的次数就是该行的频次,也就是它的权重w,加权的过程即为把该行计算出的散列值(也即二进制数串)逐位变成w或-w。实际操作的过程中,我们不需要对每一行进行频次统计,直接将每一行作为一个独立的个体来处理,每行对应的权重w可以直接看做都是1,散列值每一位的0或者1决定了其与权重值是正相乘还是负相乘,把该行计算出的散列值(也即二进制数串)逐位变成 1或-1,即完成了加权,之后将加权后的每一个散列值逐位相加即可得到结果序列串。可参见图2中“映射”、“累加”过程。
S1015,降维:对加权求和获得的结果序列串进行变换,对每一位若为正数则变换为1,否则变换为0,变得到了最终的相似哈希指纹值。
S102,指纹索引阶段:
对于两个源代码文件,判断他们是否相似以及相似程度的标准是他们之间的汉明距离(Hamming Distance)。在海量的数据集中,寻找与被测代码指纹相近的指纹值的过程是非常耗时的,因此本发明设计了索引优化方法,通过分段索引的方式大幅提高了查询效率。
具体地,本发明将每个指纹分成5段,长度分别为13,13,13,13,12,并通过排列组合将其重组作为索引分别记录在数据库的字段中。这样使得相似匹配阶段中,被测项目的哈希值能够通过索引快速定位到可能匹配的候选序列,进一步得到溯源结果。在264大小的数据集上,这样的索引方法能够将每次相似搜索的候选序列的范围大大降低,大幅提高了检索的效率。
S103,相似匹配阶段:
完成以上步骤后,相似哈希指纹库构建完毕,在相似匹配阶段对待测工程进行溯源检测,该阶段的输入为待测工程项目的源代码,输出为所有指纹库中查询到的与输入工程中代码相似的结果。
首先与预处理阶段相似,需要对文件进行标准化、特征提取以及相似哈希指纹生成的操作。然后,类似于指纹索引阶段,需要将待查询的相似哈希指纹值分成5段,两两排列组合后得到10个索引片段,分别与数据库中其对应的字段中进行精确匹配,匹配上的文件即为可能与待测文件相似的文件。最后对所有候选序列中的哈希值进一步的海明距离计算,并汇总最终计算出来的结果。
下面以一个实例对上述的方法进行说明:
为了验证本发明的效果,从Github网站上获取了星数排名较为靠前的总共60个项目作为测试集。Github是著名的开源项目社区,里面有大量广泛被应用和引用的优质开源项目源代码,而星数靠前项目往往最被关注,被复用最多的项目。
对于获取到的项目源代码进行筛选,仅仅留下部分代码相关的后缀的文件,排除无关文件的干扰。最终获取到的文件总共73453个,共7GB。
首先对其敏感性进行实验,在三个不同规模的文件上进行了实验。如表2所示,不同大小文件的Simhash值对文件变化的敏感程度不同,文件越小,对变化越敏感;文件越大,对变化越不敏感。这一特点恰恰是文件相似匹配中所需要的,因为要检测的文件越大,可以容忍的变化范围也越大。与此同时,无论文件大小如何行数多少,其Simhash值均在占总行数2%-4%的增、删操作后达到海明距离相似判定的上限3。
然后对同源匹配的准确度进行测试。将收集到的73453个文件经过前文中提到的预处理阶段和索引阶段的相关方法存入指纹库中,然后从中选取1317个文件,再加上100个基于库中源文件人工进行小部分修改的文件,总过1417个文件作为待测工程文件。经过相似匹配阶段,对这些文件依次获取同源分析的文件结果,并对结果中匹配到的克隆对进行一一比较验证。经统计分析,所有完全相同的文件都能够被正确地匹配出来,有部分修改的文件也能够匹配到对应的代码文件。在所有的被测文件的匹配结果中,误报率仅仅为1.41%,可见本方法在实际工程上能够取得比较好的效果。
本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。
Claims (10)
1.一种代码相似性检测方法,其特征在于,包括如下步骤:
S101:预处理阶段,对海量源代码文件进行预处理和特征提取工作,输出相似哈希指纹值;
S102:指纹索引阶段,根据所述预处理阶段的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配;
S103:相似匹配阶段,对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果;
步骤S101中特征提取为:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征。
2.根据权利要求1所述的一种代码相似性检测方法,其特征在于,步骤S101包括如下子步骤:
S1011,代码预处理:所述源代码文件的代码中包括无关因素,所述无关因素包括空行、空格、注释,将代码进行统一的格式化处理,去除所述无关因素;
S1012,特征提取:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征;
S1013,散列处理:使用散列算法,将源代码文件的每一个特征计算出一个对应的散列值,所述散列值为64位的二进制数串;
S1014,加权求和:以每个特征出现的频次作为特征的权重进行加权求和,散列值每一位的0或者1决定了其与权重值是正相乘还是负相乘,将加权后的每一个散列值逐位相加即可得到结果序列串;
S1015,降维:对加权求和获得的结果序列串进行变换,对每一位若为正数则变换为1,否则变换为0,得到最终的相似哈希指纹值。
3.根据权利要求1所述的一种代码相似性检测方法,其特征在于,步骤S102中,将每个指纹分成5段,并通过排列组合将其重组作为索引分别记录在相似哈希指纹库的字段中。
4.根据权利要求1所述的一种代码相似性检测方法,其特征在于,步骤S103中,首先,与预处理阶段对应,对待测工程文件进行标准化、特征提取以及相似哈希指纹生成的操作;然后,与指纹索引阶段对应,将待查询的相似哈希指纹值分成5段,两两排列组合后得到10个索引片段,分别与数据库中其对应的字段中进行精确匹配,匹配上的文件即为可能与待测文件相似的文件;最后,对所有候选序列中的哈希值作进一步的海明距离计算,并汇总最终计算出来的结果。
5.一种基于相似哈希算法的代码相似性检测***,其特征在于,包括如下模块:
预处理模块,用于对海量源代码文件进行预处理和特征提取工作,输出相似哈希指纹值;
指纹索引模块,用于根据所述预处理模块的结果,采用分段索引策略将指纹切分并重组后存入相似哈希指纹库,建立分段索引便于快速匹配;
相似匹配模块,用于对待测工程文件进行处理后生成相似哈希值,根据所述待测工程文件的相似哈希值从所述相似哈希指纹库中分段检索出溯源检测的结果;
预处理模块中特征提取工作为:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征。
6.根据权利要求5所述的一种基于相似哈希算法的代码相似性检测***,其特征在于,所述预处理模块包括如下子模块:
代码预处理子模块,代码中包括无关因素,所述无关因素包括空行、空格、注释,所述代码预处理子模块用于将代码进行统一的格式化处理,去除所述无关因素;
特征提取子模块,用于:预先通过对多种常用语言的开源项目文件进行常用行统计,并以每种语言按频次排序的前N行作为常见行列表,N为预先设定的阈值,根据所述源代码文件的后缀名判断所属语言,从常见行列表中选取对应语言的常见行筛选器,并将所述源代码文件中包含在筛选器中的对应行全部筛除,剩下的每一行作为所述源代码文件的特征;
散列处理子模块,用于:使用散列算法,将源代码文件的每一个特征计算出一个对应的散列值,所述散列值为64位的二进制数串;
加权求和子模块,用于:以每个特征出现的频次作为特征的权重进行加权求和,散列值每一位的0或者1决定了其与权重值是正相乘还是负相乘,将加权后的每一个散列值逐位相加即可得到结果序列串;
降维子模块,用于:对加权求和获得的结果序列串进行变换,对每一位若为正数则变换为1,否则变换为0,得到最终的相似哈希指纹值。
7.根据权利要求5所述的一种基于相似哈希算法的代码相似性检测***,其特征在于,所述指纹索引模块将每个指纹分成5段,并通过排列组合将其重组作为索引分别记录在相似哈希指纹库的字段中。
8.根据权利要求5所述的一种基于相似哈希算法的代码相似性检测***,其特征在于,所述相似匹配模块用于:首先,与预处理阶段对应,对待测工程文件进行标准化、特征提取以及相似哈希指纹生成的操作;然后,与指纹索引阶段对应,将待查询的相似哈希指纹值分成5段,两两排列组合后得到10个索引片段,分别与数据库中其对应的字段中进行精确匹配,匹配上的文件即为可能与待测文件相似的文件;最后,对所有候选序列中的哈希值作进一步的海明距离计算,并汇总最终计算出来的结果。
9.一种电子设备,其特征在于,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1-4任一项所述的代码相似性检测方法。
10.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-4任一项所述的代码相似性检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110198641.2A CN112579155B (zh) | 2021-02-23 | 2021-02-23 | 代码相似性检测方法、装置以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110198641.2A CN112579155B (zh) | 2021-02-23 | 2021-02-23 | 代码相似性检测方法、装置以及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112579155A CN112579155A (zh) | 2021-03-30 |
CN112579155B true CN112579155B (zh) | 2021-05-18 |
Family
ID=75113936
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110198641.2A Active CN112579155B (zh) | 2021-02-23 | 2021-02-23 | 代码相似性检测方法、装置以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112579155B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023028721A1 (en) * | 2021-08-28 | 2023-03-09 | Huawei Technologies Co.,Ltd. | Systems and methods for detection of code clones |
CN114153496B (zh) * | 2021-09-08 | 2023-09-12 | 北京天德科技有限公司 | 一种基于区块链的高速可并行代码相似度对比方法和*** |
CN113590192B (zh) * | 2021-09-26 | 2022-01-04 | 北京迪力科技有限责任公司 | 一种质量分析的方法及相关设备 |
CN113721978B (zh) * | 2021-11-02 | 2022-02-11 | 北京大学 | 一种混源软件中开源成分检测的方法和*** |
CN115378695A (zh) * | 2022-08-19 | 2022-11-22 | 安天科技集团股份有限公司 | 克隆网页检测方法及装置 |
CN115099795B (zh) * | 2022-08-29 | 2022-11-11 | 江苏青山软件有限公司 | 企业内部数字资源管理方法及*** |
CN116450581B (zh) * | 2023-04-10 | 2024-02-13 | 中国人民解放军61660部队 | 一种白名单本地快速匹配方法、***和电子设备 |
CN117932106A (zh) * | 2024-01-23 | 2024-04-26 | 北京信息职业技术学院 | 针对音频指纹库数据的多级索引方法及*** |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066262A (zh) * | 2017-03-10 | 2017-08-18 | 苏州棱镜七彩信息科技有限公司 | 源代码文件克隆邻接表合并检测方法 |
CN109445844A (zh) * | 2018-11-05 | 2019-03-08 | 浙江网新恒天软件有限公司 | 基于哈希值的代码克隆检测方法、电子设备、存储介质 |
CN112257068A (zh) * | 2020-11-17 | 2021-01-22 | 南方电网科学研究院有限责任公司 | 一种程序相似性检测方法、装置、电子设备和存储介质 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9805099B2 (en) * | 2014-10-30 | 2017-10-31 | The Johns Hopkins University | Apparatus and method for efficient identification of code similarity |
CN106990956B (zh) * | 2017-03-10 | 2020-11-24 | 苏州棱镜七彩信息科技有限公司 | 基于后缀树的代码文件克隆检测方法 |
CN109445834B (zh) * | 2018-10-30 | 2021-04-30 | 北京计算机技术及应用研究所 | 基于抽象语法树的程序代码相似性快速比较方法 |
CN110362343A (zh) * | 2019-07-19 | 2019-10-22 | 上海交通大学 | N-Gram的检测字节码相似度的方法 |
CN111290784B (zh) * | 2020-01-21 | 2021-08-24 | 北京航空航天大学 | 适用于大规模样本的程序源代码相似度检测方法 |
CN111666101A (zh) * | 2020-04-24 | 2020-09-15 | 北京大学 | 软件同源分析方法及装置 |
CN111562920A (zh) * | 2020-06-08 | 2020-08-21 | 腾讯科技(深圳)有限公司 | 小程序代码相似度确定方法、装置、服务器及存储介质 |
-
2021
- 2021-02-23 CN CN202110198641.2A patent/CN112579155B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066262A (zh) * | 2017-03-10 | 2017-08-18 | 苏州棱镜七彩信息科技有限公司 | 源代码文件克隆邻接表合并检测方法 |
CN109445844A (zh) * | 2018-11-05 | 2019-03-08 | 浙江网新恒天软件有限公司 | 基于哈希值的代码克隆检测方法、电子设备、存储介质 |
CN112257068A (zh) * | 2020-11-17 | 2021-01-22 | 南方电网科学研究院有限责任公司 | 一种程序相似性检测方法、装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112579155A (zh) | 2021-03-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112579155B (zh) | 代码相似性检测方法、装置以及存储介质 | |
US11853334B2 (en) | Systems and methods for generating and using aggregated search indices and non-aggregated value storage | |
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
CN111581355B (zh) | 威胁情报的主题检测方法、装置和计算机存储介质 | |
US20080114725A1 (en) | Method and System for High Performance Data Metatagging and Data Indexing Using Coprocessors | |
US20070016612A1 (en) | Molecular keyword indexing for chemical structure database storage, searching, and retrieval | |
CN111258966A (zh) | 一种数据去重方法、装置、设备及存储介质 | |
US20190228085A1 (en) | Log file pattern identifier | |
US11288266B2 (en) | Candidate projection enumeration based query response generation | |
US20080127043A1 (en) | Automatic Extraction of Programming Rules | |
CN108304382A (zh) | 基于制造过程文本数据挖掘的质量分析方法与*** | |
CN115658080A (zh) | 一种软件开源代码成分的识别方法及*** | |
US20040186833A1 (en) | Requirements -based knowledge discovery for technology management | |
Vandic et al. | A semantic clustering-based approach for searching and browsing tag spaces | |
CN112148359B (zh) | 一种基于子块过滤的分布式代码克隆检测与搜索方法、***及介质 | |
Zulkifeli et al. | Classic term weighting technique for mining web content outliers | |
CN112214494B (zh) | 检索方法及装置 | |
CN114816518A (zh) | 基于simhash的源代码中开源成分筛选识别方法及*** | |
Sanjana | Ad service detection-a comparative study using machine learning techniques | |
CN109918367B (zh) | 一种结构化数据的清洗方法、装置、电子设备及存储介质 | |
CN113971403A (zh) | 一种考虑文本语义信息的实体识别方法及*** | |
Singh et al. | User specific context construction for personalized multimedia retrieval | |
Khalid et al. | MDORG: Annotation Assisted Rule Agents for Metadata Files. | |
Chauhan et al. | A parallel computational approach for similarity search using Bloom filters | |
US20240086448A1 (en) | Detecting cited with connections in legal documents and generating records of same |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
PE01 | Entry into force of the registration of the contract for pledge of patent right |
Denomination of invention: Code similarity detection method, device and storage medium Effective date of registration: 20220826 Granted publication date: 20210518 Pledgee: Beijing first financing Company limited by guarantee Pledgor: BEIJING PEKING UNIVERSITY SOFTWARE ENGINEERING CO.,LTD. Registration number: Y2022980013696 |
|
PE01 | Entry into force of the registration of the contract for pledge of patent right |