过滤非法字符

 再度改进,在脏字可能存在的情况下,例如出现了多个脏字前Length-1部分时,性能相比http://www.cnblogs.com/xingd/archive/2008/01/31/1060425.html中描述的又提升了300%~400%。

直接贴出全部代码了,通过新增的一个byte[char.MaxValue]和BitArray(char.MaxValue),减少了大量的Substring和GetHashCode的调用。耗的内存也不算多,除HashSet外,仅需要144k内存。

引用此文或者使用此代码请说明出处,谢谢,以便于我将来的更新。

2008-02-02修订:if (index > 0 || (fastCheck[text[index]] & 1) == 0) 应去掉index > 0的判断,这个优化考虑的不够成熟。感谢sumtec和灵感之源指出错误。避免最短匹配时,可以在 if (hash.Contains(sub)) 之后,可以加入判断 if ((fastLength[begin] >> Math.Min(j,7)) == 0),然后再return true。

2008-02-03修订:for循环内部的if ((fastCheck[current] & 1== 0)应为if ((fastCheck[current] & 1== 0 && count == j)。修正bug并加入大小写敏感后,效率降低1倍。

public   class  BadWordsFilter
{
    
private  HashSet < string >  hash  =   new  HashSet < string > ();
    
private   byte [] fastCheck  =   new   byte [ char .MaxValue];
    
private   byte [] fastLength  =   new   byte [ char .MaxValue];
    
private  BitArray charCheck  =   new  BitArray( char .MaxValue);
    
private  BitArray endCheck  =   new  BitArray( char .MaxValue);
    
private   int  maxWordLength  =   0 ;
    
private   int  minWordLength  =   int .MaxValue;

    
public  BadWordsFilter()
    {

    }

    
public   void  Init( string [] badwords)
    {
        
foreach  ( string  word  in  badwords)
        {
            maxWordLength 
=  Math.Max(maxWordLength, word.Length);
            minWordLength 
=  Math.Min(minWordLength, word.Length);

            
for  ( int  i  =   0 ; i  <   7   &&  i  <  word.Length; i ++ )
            {
                fastCheck[word[i]] 
|=  ( byte )( 1   <<  i);
            }

            
for  ( int  i  =   7 ; i  <  word.Length; i ++ )
            {
                fastCheck[word[i]] 
|=   0x80 ;
            }

            
if  (word.Length  ==   1 )
            {
                charCheck[word[
0 ]]  =   true ;
            }
            
else
            {
                fastLength[word[
0 ]]  |=  ( byte )( 1   <<  (Math.Min( 7 , word.Length  -   2 )));
                endCheck[word[word.Length 
-   1 ]]  =   true ;

                hash.Add(word);
            }
        }
    }

    
public   string  Filter( string  text,  string  mask)
    {
        
throw   new  NotImplementedException();
    }

    
public   bool  HasBadWord( string  text)
    {
        
int  index  =   0 ;

        
while  (index  <  text.Length)
        {
            
int  count  =   1 ;

            
if  (index  >   0   ||  (fastCheck[text[index]]  &   1 ==   0 )
            {
                
while  (index  <  text.Length  -   1   &&  (fastCheck[text[ ++ index]]  &   1 ==   0 ) ;
            }

            
char  begin  =  text[index];

            
if  (minWordLength  ==   1   &&  charCheck[begin])
            {
                
return   true ;
            }

            
for  ( int  j  =   1 ; j  <=  Math.Min(maxWordLength, text.Length  -  index  -   1 ); j ++ )
            {
                
char  current  =  text[index  +  j];

                
if  ((fastCheck[current]  &   1 ==   0 )
                {
                    
++ count;
                }

                
if  ((fastCheck[current]  &  ( 1   <<  Math.Min(j,  7 )))  ==   0 )
                {
                    
break ;
                }

                
if  (j  +   1   >=  minWordLength)
                {
                    
if  ((fastLength[begin]  &  ( 1   <<  Math.Min(j  -   1 7 )))  >   0   &&  endCheck[current])
                    {
                        
string  sub  =  text.Substring(index, j  +   1 );

                        
if  (hash.Contains(sub))
                        {
                            
return   true ;
                        }
                    }
                }
            }

            index 
+=  count;
        }

        
return   false ;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
是的,Spring Boot可以使用过滤器(Filter)来过滤非法字符。可以在过滤器中对请求进行预处理和后处理,比如字符编码转换、参数校验、安全控制等。以下是一个示例过滤器,它可以过滤掉请求中的非法字符: ```java @Component public class IllegalCharacterFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化过滤器 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 进行字符编码转换 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 获取请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String name = entry.getKey(); String[] values = entry.getValue(); for (int i = 0; i < values.length; i++) { String value = values[i]; // 过滤非法字符 if (containsIllegalCharacter(value)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "包含非法字符"); return; } } } // 执行下一个过滤器或目标资源 filterChain.doFilter(request, response); } @Override public void destroy() { // 销毁过滤器 } private boolean containsIllegalCharacter(String value) { // 判断是否包含非法字符,例如 <script>、alert() 等 return value.contains("<script>") || value.contains("alert("); } } ``` 在上述示例中,IllegalCharacterFilter 实现了 Filter 接口,并通过 @Component 注解将其注册为 Spring Bean。在 doFilter 方法中,通过 request.setCharacterEncoding 和 response.setCharacterEncoding 进行字符编码转换,然后获取请求参数并遍历每个参数值,判断是否包含非法字符。如果包含非法字符,则直接返回错误响应,否则执行下一个过滤器或目标资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值