asp.NET 臟字過濾算法
更新時(shí)間:2009年10月25日 10:15:24 作者:
asp.NET 臟字過濾算法,需要參考上一篇文章,大家可以比較下。
原文見http://m.fzitv.net/article/20575.htm
但在我這里測(cè)試的時(shí)候,RegEx要快一倍左右。但是還是不太滿意,因?yàn)槲覀兙W(wǎng)站上臟字過濾用的相當(dāng)多,對(duì)效率已經(jīng)有了一些影響,經(jīng)過一番思考后,自己做了一個(gè)算法。在自己的機(jī)器上測(cè)試了一下,使用原文中的臟字庫(kù),0x19c的字符串長(zhǎng)度,1000次循環(huán),文本查找耗時(shí)1933.47ms,RegEx用了1216.719ms,而我的算法只用了244.125ms.
更新:新增一個(gè)BitArray,用于判斷某char是否在所有臟字中出現(xiàn)過??倳r(shí)間由244ms降到了34ms.
主要算法如代碼所示
private static Dictionary dic = new Dictionary();
private static BitArray fastcheck = new BitArray(char.MaxValue);
static void Prepare()
{
string[] badwords = // read from file
foreach (string word in badwords)
{
if (!dic.ContainsKey(word))
{
dic.Add(word, null);
maxlength = Math.Max(maxlength, word.Length);
fastcheck[word[0]] = true;
}
}
}
使用的時(shí)候
int index = 0;
while (index < target.Length)
{
if (!fastcheck[target[index]])
{
while (index < target.Length - 1 && !fastcheck[target[++index]]) ;
}
for (int j = 0; j < Math.Min(maxlength, target.Length - index); j++)
{
string sub = target.Substring(index, j);
if (dic.ContainsKey(sub))
{
sb.Replace(sub, "***", index, j);
index += j;
break;
}
}
index++;
}
但在我這里測(cè)試的時(shí)候,RegEx要快一倍左右。但是還是不太滿意,因?yàn)槲覀兙W(wǎng)站上臟字過濾用的相當(dāng)多,對(duì)效率已經(jīng)有了一些影響,經(jīng)過一番思考后,自己做了一個(gè)算法。在自己的機(jī)器上測(cè)試了一下,使用原文中的臟字庫(kù),0x19c的字符串長(zhǎng)度,1000次循環(huán),文本查找耗時(shí)1933.47ms,RegEx用了1216.719ms,而我的算法只用了244.125ms.
更新:新增一個(gè)BitArray,用于判斷某char是否在所有臟字中出現(xiàn)過??倳r(shí)間由244ms降到了34ms.
主要算法如代碼所示
復(fù)制代碼 代碼如下:
private static Dictionary dic = new Dictionary();
private static BitArray fastcheck = new BitArray(char.MaxValue);
static void Prepare()
{
string[] badwords = // read from file
foreach (string word in badwords)
{
if (!dic.ContainsKey(word))
{
dic.Add(word, null);
maxlength = Math.Max(maxlength, word.Length);
fastcheck[word[0]] = true;
}
}
}
使用的時(shí)候
復(fù)制代碼 代碼如下:
int index = 0;
while (index < target.Length)
{
if (!fastcheck[target[index]])
{
while (index < target.Length - 1 && !fastcheck[target[++index]]) ;
}
for (int j = 0; j < Math.Min(maxlength, target.Length - index); j++)
{
string sub = target.Substring(index, j);
if (dic.ContainsKey(sub))
{
sb.Replace(sub, "***", index, j);
index += j;
break;
}
}
index++;
}
您可能感興趣的文章:
- asp.NET 臟字過濾算法 修改版
- ASP.NET過濾器的應(yīng)用方法介紹
- asp.net 過濾圖片標(biāo)簽的正則
- ASP.NET環(huán)境下為網(wǎng)站增加IP過濾功能
- ASP.NET過濾HTML標(biāo)簽只保留換行與空格的方法
- ASP.NET過濾HTML字符串方法總結(jié)
- ASP.NET中的URL過濾實(shí)現(xiàn)代碼
- asp.net 臟字典過濾問題 用正則表達(dá)式來過濾臟數(shù)據(jù)
- Asp.net之?dāng)?shù)據(jù)過濾淺析
- ASP.NET過濾類SqlFilter,防止SQL注入
- 高效.NET臟字過濾算法與應(yīng)用實(shí)例
相關(guān)文章
ASP.NET 文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)代碼
在文件下載的時(shí)候,使用斷點(diǎn)續(xù)傳可以將上次未下載完成的文件繼續(xù)下載,該功能在開發(fā)文件下載的時(shí)候非常重要。這里我將介紹一種比較簡(jiǎn)單的斷點(diǎn)續(xù)傳功能的實(shí)現(xiàn)方法,僅供初學(xué)者參考使用2012-06-06
從請(qǐng)求管道深入剖析HttpModule的實(shí)現(xiàn)機(jī)制圖文介紹
想要了解底層的原理必須對(duì)請(qǐng)求處理過程和頁(yè)面的生命周期有點(diǎn)了解才方便您入門學(xué)習(xí)一下內(nèi)容,本文將詳細(xì)介紹2012-11-11
Repeater控件動(dòng)態(tài)變更列(Header,Item和Foot)信息(重構(gòu)cs)
上一篇雖然它算不上是完全動(dòng)態(tài)化,但它已經(jīng)達(dá)到初期想要的效果,現(xiàn)另開一篇,不是重新另外寫,而是想重構(gòu)cs的代碼,因?yàn)榍耙黄拇a雖然簡(jiǎn)單,但代碼冗余過多,感興趣的朋友可以參考下哈2013-03-03
DropDownList根據(jù)下拉項(xiàng)的Text文本序號(hào)排序
在某些時(shí)候表中沒有可以排序的字段同時(shí)呢也不想修改表結(jié)構(gòu),但它的項(xiàng)文本有序號(hào)這時(shí)就可以用這方法排序,感興趣的你可以參考下,或許本文知識(shí)點(diǎn)對(duì)你有所幫助2013-03-03
ASP.NET用戶注冊(cè)實(shí)戰(zhàn)(第11節(jié))
這篇文章主要介紹了ASP.NET用戶注冊(cè)實(shí)戰(zhàn),鞏固前10小節(jié)所學(xué)的全部知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
ASP.Net中防止刷新自動(dòng)觸發(fā)事件的解決方案
ASP.Net中防止刷新自動(dòng)觸發(fā)事件的解決方案...2007-03-03
ASP.net中Core自定義View查找位置的實(shí)例代碼
在本篇文章里小編給大家分享的是關(guān)于ASP.net中Core自定義View查找位置的實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2020-04-04

