Hyperscan 5.0.0 版本已于2018年7月9日在Github ( https://github.com/intel/hyperscan ) 上发布。
这一新版本主要涉及3个改进:
加入Hyperscan/libpcre混合库,支持所有PCRE语法特性;
加入“逻辑组合”新特性,满足对多规则进行自定义的逻辑组合匹配的需求;
加入Hyperscan工具对Windows操作系统的支持(包括win32/64平台);
该库有效整合Hyperscan与libpcre,旨在支持PCRE完整语法的同时,亦能获益于Hyperscan的高性能优势。对于任何覆盖PCRE所有语法的目标规则集,Chimera对其同时进行Hyperscan与PCRE编译,得到混合database,运行时根据Hyperscan本身对具体规则语法的支持程度,来决定是否用Hyperscan直接进行匹配验证,亦或先扮演过滤角色,由PCRE进行最终匹配验证。
Chimera库提供与原生Hyperscan库类似的编译时期和运行时期API。Chimera被设计为和PCRE有相同的匹配行为,包括了贪婪和非贪婪,以及捕获机制等等。同时,Chimera和PCRE一样会同时返回匹配的起始位置和结束位置。与Hyperscan返回所有的匹配位置不同,Chimera只返回无重叠区域的匹配区间。例如,规则 /foofoo/ 在语料 “foofoofoofoo” 中返回的匹配区间仅为(0, 6) 和 (6, 12)。值得注意的是,Chimera对正则语法的支持虽然更加完善,但其匹配性能相较纯Hyperscan而言仍会有所下降,我们建议只在需要对PCRE语法进行完全支持的情况下使用Chimera,而对于Hyperscan本身足够应付的场合仍沿用Hyperscan库以获得高性能表现。
该特性提供了新的规则使用场景:对于一组规则来说,用户可能关心部分规则的匹配,也可能需要部分规则不被匹配,单个规则有自己的逻辑语义,而整组规则的逻辑组合后的整体匹配行为,才是用户所需要的结果。我们为规则的逻辑语义定义了3种逻辑操作符,即常见的 “NOT”,“AND”,“OR”。规则的逻辑组合用中缀表示法来书写,它包含操作符,操作子,和小括号。操作子是规则ID,定义在别处,操作符为!(NOT),&(AND),|(OR)。例如 ((301 OR 302) AND 303) AND (304 OR NOT 305) 可表示为((301 | 302) & 303) & (304 | !305)。操作符优先级为! > & > |。
逻辑组合表达式的匹配仍然沿用Hyperscan的编译和运行时API,只是需要对其设置新的标志位HS_FLAG_COMBINATION来确指。同时,逻辑组合表达式和其内部操作子对应的规则必须同时进行编译。在执行逻辑组合的匹配过程时,每个内部操作子对应规则的匹配位置仍然会被正常报告,在这些位置中,一旦逻辑组合的布尔值为TRUE,组合本身也会在当前位置报告成功匹配。对于只关心逻辑组合结果的情况,标志位HS_FLAG_QUITE可用来取消逻辑组合内部子规则的匹配报告。
Hyperscan库,包括基本测试工具hsbench,hscheck,hscollider以及hsdump目前可以在Windows8或Windows更新版本上编译和运行,编译工具为Intel C++ Compiler或者Visual Studio 2017。需要注意的是,为了在Windows上正常支持Ragel,用户可能需要借助Cygwin来进行源码构建。
优化了编译阶段无向图的实现,使得图拷贝的开销减少,提升了规则的编译效率。
o Issue #86: 为安装的PCRE包提供hscollider支持。
github:https://github.com/intel/hyperscan/releases/tag/v5.0.0
安装指南:https://intel.github.io/hyperscan/dev-reference/getting_started.html
转自:https://mp.weixin.qq.com/s/QOctINBbeskccQn7NMOUlA
!符号代表当前位置没发生匹配
关于逻辑表达式的距离: "101 & 102 & !105"
对于有非逻辑符的表达式, 如果101和102都匹配了, 在当前位置105没匹配中, 则
"101 & 102 & !105" 表达式会计算为true, on_match会返回逻辑表达式的id。
网友评论