当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.NET 脏字过滤算法 修改版

ASP.NET
asp.net 使用Silverlight操作ASPNETDB数据库
ASP.NET 前后台调用方法
ASP.NET中等安全模式的一些经验分享
asp.net 打印控件使用方法
网站开发技术:ASP.NET 2.0搭建网站
ASP.NET实例教程:创建数据透视表
ASP.NET 4进行SEO优化提高网站排名和权重
ASP.NET实例教程:订阅 GeoRSS 订阅源
ASP.NET页面间数据传递的9种方法
ASP.NET教程:网页表单多个按钮完成不同功能
Asp.net的服务器推技术 (Server Push)
asp.net 无刷新附件上传实现方法
ASP.NET 定制简单的错误处理页面实现代码
c# 在WebBrowser中用SendMessage模拟鼠标点击
asp.net 表单验证新思路
.NET从优酷专辑中采集所有视频及信息(VB.NET代码)
VS2005 水晶报表在时部署时遇到的问题
ASP.NET 输出图片简单代码
一天精通asp.net的学习经验小结
DataGridView中绑定DataTable数据及相关操作实现代码

ASP.NET 中的 asp.NET 脏字过滤算法 修改版


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 50 ::
收藏到网摘: n/a

我们网站的脏字字典中大概有600多个词,而且会发生变化,因此简单的在数据新增/修改的时候做一次脏字过滤是不够的。在网站从.NET 1.1到2.0改版的时候,对新版的测试发现旧的脏字过滤算法耗费的时间过长,需要做一些优化。 旧的算法是简单对每一个脏字调用一遍 string.replace,当然是用了StringBuilder。http://www.ruanchen.com/"codetitle">复制代码 代码如下:

private Dictionary<string, object> hash = new Dictionary<string, object>();
private BitArray firstCharCheck = new BitArray(char.MaxValue);
private BitArray allCharCheck = new BitArray(char.MaxValue);
private int maxLength = 0;

其中hash只使用到了key,value都置为null。也可以使用.NET 3.5中的HashSet,或者使用Dictionary<string, int>,记录脏字的出现次数。
初始化这些数据的方法如下:
复制代码 代码如下:

foreach (string word in badwords)
{
if (!hash.ContainsKey(word))
{
hash.Add(word, null);
maxlength = Math.Max(maxlength, word.Length);
firstCharCheck[word[0]] = true;
foreach (char c in word)
{
allCharCheck[c] = true;
}
}
}

判断脏字是否出现在一个字符串中的代码如下:
复制代码 代码如下:

int index = 0;
int offset = 0;
while (index < text.Length)
{
if (!firstCharCheck[text[index]])
{
while (index < text.Length - 1 && !firstCharCheck[text[++index]]) ;
}
for (int j = 1; j <= Math.Min(maxlength, text.Length - index); j++)
{
if (!allCharCheck[text[index + j - 1]])
{
break;
}
string sub = text.Substring(index, j);
if (hash.ContainsKey(sub))
{
return true;
}
}
index++;
}
return false;

替换的代码就不贴了,跟判断包含类似,只不过不能发现一个脏字后就退出循环。如果出现脏字的可能不是很高,就没有必要创建一个临时的StringBuilder。
进一步,可以通过借鉴.NET源码中string.GetHashCode()的实现,避免一次Substring的调用,提高性能。也可以设计递进的HashCode实现,比如"helloworld"可以用"helloworl"的hash进一步计算,优化效率。
另外,也可以抛弃Hash,改用排序过的string[],用BinarySearch来判断sub是否为脏字。BinarySearch的结果是可以递进的,即可以用查找"helloworl"的结果来加速判断"helloworld"。 (已测试,700个脏字,BinarySearch的效率有时会低很多。)
最后发一点牢骚,当初最早发的时候(http://www.ruanchen.com/rticle/20576.htm),仅仅是为了说明下自己的算法,具体的代码甚至还有一点错误。两个事情让我觉得心里不很爽,一个是被乱七八糟的无数网站转载而不说明出处,导致我后来的改进和错误修正达不到效果,二是一些人都愿意看到最终的代码,而不是理解我想要表达的最核心的设计,然后自己去考虑实现。

评论 (0) All

登陆 还没注册?