xingd.net

.net related techonology

导航

忽略大小写的.NET脏字过滤算法

Posted on 2008-02-04 19:37  xingd  阅读(3831)  评论(21编辑  收藏  举报
重复的内容就不再重复了,参考http://www.cnblogs.com/xingd/archive/2008/02/01/1061800.html

除了实现忽略大小写外,其他方面的性能也做了一些改进,主要借助下面的类,StringSegement,实现了大小写无关的比较和GetHashCode,同时避免了Substring的调用。

public class StringSegment
{
    
private string original;
    
private int offset = 0;
    
private int length = 0;

    
public StringSegment(string s)
    {
        
this.original = s;
        
this.length = original.Length;
    }

    
public void Slice(int offset, int length)
    {
        
this.offset = offset;
        
this.length = length;
    }

    
public override bool Equals(object obj)
    {
        StringSegment sg 
= obj as StringSegment;
        
return sg != null && sg.length == this.length && string.Compare(this.original, this.offset, sg.original, sg.offset, this.length, true== 0;
    }

    
public override int GetHashCode()
    {
        
// call char.tolower and calculate hash code
    }
}

GetHashCode的实现完全参考string的实现,就不重复了,挺长的一段。

另外,对于特征判断的数据,规划为64k x 4 bytes,也就是每char给4 bytes特征数据,如果有算法改进,只要在这4 bytes里重新规划,现在的定义如下:

[StructLayout(LayoutKind.Explicit, Size = 32)]
internal struct FastCheckFlag
{
    [FieldOffset(
0)]
    
public byte occur;    // 1st~8th char occurrence
    [FieldOffset(8)]
    
public byte length;   // 2~9 word length begin with this char
    [FieldOffset(16)]
    
public byte rlength; // 2~9 word length end with this char (reverse length);
    [FieldOffset(24)]
    
public bool single; // single char bad words
    [FieldOffset(25)]
    
public bool last;    // last occurrence
    [FieldOffset(26)]
    
public byte occurParity;  // 9th~ occurrence parity flag
    [FieldOffset(28)]
    
public byte lengthParity; // 10~ length parity flag
    [FieldOffset(30)]
    
public byte rlengthParity; // 10~ rlength parity flag
}

 另外在初始化数据的时候,取字符的大小写同时处理,例如:

if (word.Length == 1)
{
    fastCheck[
char.ToLower(word[0])].single = true;
    fastCheck[
char.ToUpper(word[0])].single = true;
}


完整的代码就不贴了,经过实际测试,效率还是很不错。鼓励读者按照我的几篇文章自己写具体的代码,以及替换的实现。有问题请留评论,我会逐一回复,但是直接要代码的就免了。

索引:
我最早看到的文章,包含脏字典和测试代码,有string和regex两种实现。http://www.cnblogs.com/goody9807/archive/2006/09/12/502094.html
我的第一篇文章,区分大小写,两个BitArray优化,主要介绍思路。 http://www.cnblogs.com/xingd/archive/2007/09/26/906013.html
我整理过的实现,区分大小写,同第一篇,我们正在用的版本。http://www.cnblogs.com/xingd/archive/2008/01/23/1050443.html
第一次改进,区分大小写,扩展到了8个字符判断。http://www.cnblogs.com/xingd/archive/2008/01/31/1060425.html
第二次改进,区分大小写,增加了长度判断和结束符。http://www.cnblogs.com/xingd/archive/2008/02/01/1061800.html
最终版本,不区分大小写,消除Substring的代价,本文。