加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

algorithm – 使用DOS通配符强制执行字符串的最快方法

发布时间:2020-12-14 02:27:48 所属栏目:Windows 来源:网络整理
导读:此问题类似于盲SQL注入.目标是确定字符串的确切值,您可以做的唯一测试是查看指定的DOS样式通配符(?=任何字符,* =任何数字的任何字符)是否与字符串匹配. (所以实际上你只能访问bool DoesWildcardMatch(字符串通配符)函数). 直接的方法是测试*,b *,c * ……直
此问题类似于盲SQL注入.目标是确定字符串的确切值,您可以做的唯一测试是查看指定的DOS样式通配符(?=任何字符,* =任何数字的任何字符)是否与字符串匹配. (所以实际上你只能访问bool DoesWildcardMatch(字符串通配符)函数).

直接的方法是测试*,b *,c * ……直到找到第一个字母,然后重复.我能想到的一些优化:

>搜索* a *,* b *等以确定字符集
>当找到* x *上的匹配时,执行divide-et-impera(* a * x *,* b * x *,…)

解决方法

第一个念头.您可以在O(log2(n))中确定字符串的长度n.

>检查Z *,其中Z表示从0开始的k个问号,然后是1,然后每次检查将问号的数量加倍,直到不匹配为止. n必须在k / 2和k之间
>使用相同的模式更改k,以与二分查找相同的方式查找确切的长度.

知道确切的长度可能有助于在空间域中执行一种除法.

UPDATE

如果知道长度,则可以使用相同的模式正确定位符号.

例:

    ..X. ..XX (spaces added for readability)

                              + symbol may be X
                              - symbol is not X
                              X symbol is X

    *X*         => MATCH      ++++ ++++
    *X*   ????  => MATCH      ++++ ++++
    *X*?? ????  => NO MATCH   --++ ++++
    ??X?  ????  => MATCH      --X+ ++++
    ??XX  ????  => NO MATCH   --X- ++++
    ??X?  *X*?? => NO MATCH   --X- --++
    ??X?  ??X?  => MATCH      --X- --X+
    ??X?  ??XX  => MATCH      --X- --XX

对于字符串长度n和字母大小m,这将需要大约O(log2(n))来查找字符串的长度,大约O(n?log2(n))以正确放置n个符号,并且O(m)来查找使用的符号 – 总计得到的结果为O(n?log2(n)m).

我可以想象通过合并几个步骤可以加快速度 – 可以在确定字符串长度的同时测试用过的符号,或者在字符串的第一个和第二个半部分中同时定位两个(甚至更多?)符号.如果检查失败,这将需要单独重新检查合并的步骤,以确定哪个检查faild.但只要合并检查成功,您就可以获得两者的信息.

也许我会在明天计算一下,看看它是否会真正加快速度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读