若天明 发表于 2015-1-18 11:19:59

ASP.NET网站制作之(重发).NET脏字过滤算法仓酷云

因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如net网页编程改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。我们网站的脏字字典中也许有600多个词,并且会产生变更,因而复杂的在数据新增/修正的时分做一次脏字过滤是不敷的。在网站从.NET1.1到2.0改版的时分,对新版的测试发明旧的脏字过滤算法泯灭的工夫太长,必要做一些优化。

旧的算法是复杂对每个脏字挪用一遍string.replace,固然是用了StringBuilder。在cnblogs里发明了一篇会商脏字过滤的blog/dotnet/20111127/315432.html。在我这里测试的时分,RegEx要快一倍摆布。可是仍是不太中意,应为我们网站上脏字过滤用的相称多,经由一番思索后,本人做了一个算法。在本人的呆板上测试了一下,利用原文中的脏字库,0x19c的字符串长度,1000次轮回,文本查找耗时1933.47ms,RegEx用了1216.719ms,而我的算法只用了34.125ms.

算法的关头,仍是利用空间来换工夫,利用了2个全局的BitArray,长度均为Char.MaxValue。个中一个BitArray用来判别是不是有某个char开首的脏字,另外一个BitArray用来判别一切脏字中是不是包括某个char。经由这两个BitArray,能够做出疾速判别,以后就利用HashCode来判别完全的脏字,经由过程事后猎取的最年夜脏字长度优化遍历历程。

必要的变量以下:

privateDictionary<string,object>hash=newDictionary<string,object>();

privateBitArrayfirstCharCheck=newBitArray(char.MaxValue);

privateBitArrayallCharCheck=newBitArray(char.MaxValue);

privateintmaxLength=0;
个中hash只利用到了key,value都置为null。也能够利用.NET3.5中的HashSet,大概利用Dictionary<string,int>,纪录脏字的呈现次数。

初始化这些数据的办法以下:
foreach(stringwordinbadwords)
{
if(!hash.ContainsKey(word))
{
hash.Add(word,null);
maxlength=Math.Max(maxlength,word.Length);
firstCharCheck]=true;

foreach(charcinword)
{
allCharCheck=true;
}
}
}判别脏字是不是呈现在一个字符串中的代码以下:

intindex=0;
intoffset=0;
while(index<text.Length)
{
if(!firstCharCheck])
{
while(index<text.Length-1&&!firstCharCheck]);
}

for(intj=1;j<=Math.Min(maxlength,text.Length-index);j++)
{
if(!allCharCheck])
{
break;
}

stringsub=text.Substring(index,j);

if(hash.ContainsKey(sub))
{
returntrue;
}
}

index++;
}

returnfalse;
交换的代码就不贴了,跟判别包括相似,只不外不克不及发明一个脏字后就加入轮回。假如呈现脏字的大概不是很高,就没有需要创立一个一时的StringBuilder。

进一步,能够经由过程自创.NET源码中string.GetHashCode()的完成,制止一次Substring的挪用,进步功能。也能够计划递进的HashCode完成,好比"helloworld"能够用"helloworl"的hash进一步盘算,优化效力。

<strike>别的,也能够丢弃Hash,改用排序过的string[],用BinarySearch来判别sub是不是为脏字。BinarySearch的了局是能够递进的,便可以用查找"helloworl"的了局来减速判别"helloworld"。</strike>(已测试,700个脏字,BinarySearch的效力偶然会低良多。)

最初发一点怨言,现在最早发的时分(/dotnet/20111127/315435.html),仅仅是为了申明下本人的算法,详细的代码乃至另有一点毛病。两个事变让我以为内心不很爽,一个是被七零八落的有数网站转载而不申明出处,招致我厥后的改善和毛病修改达不到效果,二是一些人都乐意看到终极的代码,而不是了解我想要表达的最中心的计划,然后本人往思索完成。我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。

飘飘悠悠 发表于 2015-1-20 20:42:16

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

仓酷云 发表于 2015-1-20 20:42:21

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

莫相离 发表于 2015-1-23 23:08:52

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

若天明 发表于 2015-1-31 20:36:53

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

爱飞 发表于 2015-2-4 06:12:43

ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。

分手快乐 发表于 2015-2-7 03:59:38

那么,ASP.Net有哪些改进呢?

活着的死人 发表于 2015-2-8 02:27:14

可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。

飘灵儿 发表于 2015-2-24 01:54:46

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

变相怪杰 发表于 2015-2-28 18:50:14

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。

乐观 发表于 2015-3-10 04:34:01

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

只想知道 发表于 2015-3-11 02:01:32

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

兰色精灵 发表于 2015-3-17 18:13:32

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

透明 发表于 2015-3-24 18:43:31

ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
页: [1]
查看完整版本: ASP.NET网站制作之(重发).NET脏字过滤算法仓酷云