專利名稱:一種字符串引用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機應用技術(shù)領(lǐng)域,特別是指一種字符串引用方法。
背景技術(shù):
在C語言以及C++語言中,字符串被用作其它對象的索引或?qū)ο蟊旧恚瑐鹘y(tǒng)的字符串是由各引用字符串的功能單元根據(jù)自身使用需要生成并獨立保存,然后使用的,而且在引用過程中需要進行字符串比較時,則采取將待比較字符串的所有組成字符逐一比較的方式來確定待比較的字符串是否相同,當該功能單元引用完字符串后,則將自身保存的字符串刪除。
這種傳統(tǒng)的字符串引用方法一方面由于需要各功能單元獨立保存字符串,因此有可能造成相同字符串在多個功能單元進行存儲而冗余占用系統(tǒng)存儲空間的狀況。另一方面,由于各功能單元所使用字符串的長度通常比較長,也就意味著字符串的組成字符個數(shù)比較多,這時的字符串比較就成為一項非常繁瑣的操作。
現(xiàn)有的微軟軟件框架庫(MFC)中的CmapStringToPtr類采取將字符串與特定對象相關(guān)聯(lián),從而實現(xiàn)索引特定對象的目的。而如果利用該類來管理字符串,則需要將字符串與字符串關(guān)聯(lián)。該方法流程如圖1所示,具體包括如下步驟步驟101在CmapStringToPtr類中設(shè)置一定數(shù)目的哈希(Hash)分組,每個哈希分組分別用于存儲一系列與字符串相對應的哈希值。
其中,哈希值是根據(jù)CmapStringToPtr類中的一種設(shè)定算法得到的用于表現(xiàn)相應字符串特征的值,一個哈希值既可能對應一個字符串,也可能對應多個不同的字符串,但一個哈希值只能歸屬于一個哈希分組。
步驟102當外部功能單元需要使用字符串時,則向CmapStringToPtr類輸入字符串以及該字符串的關(guān)聯(lián)字符串,并在自身保存關(guān)聯(lián)串。以下將前者稱為母串,后者稱為關(guān)聯(lián)串。其中,母串是外部功能單元要使用的字符串,而關(guān)聯(lián)串則只是母串的索引。
步驟103當CmapStringToPtr類接收到母串和關(guān)聯(lián)串后,根據(jù)自身的一種設(shè)定算法計算關(guān)聯(lián)串的哈希值,然后將得到的哈希值除以設(shè)置的哈希分組的數(shù)目,并根據(jù)計算結(jié)果確定出每個哈希值歸屬的哈希分組,最后將哈希值、關(guān)聯(lián)串以及母串一并放入相應的哈希分組中;而如果發(fā)現(xiàn)不存在相應的哈希分組,則創(chuàng)建新的哈希分組,然后將哈希值、關(guān)聯(lián)串以及母串存入新建的哈希分組中。
步驟104當外部功能單元使用母串時,則通過向相應的CmapStringToPtr類提交自身保存的關(guān)聯(lián)串獲取相應的母串。
步驟105CmapStringToPtr類根據(jù)申請首先計算出關(guān)聯(lián)串的哈希值,然后根據(jù)計算所得的哈希值確定該哈希值所歸屬的哈希分組,最后從相應的哈希分組中索引出母串,并將其輸出至外部功能單元。
從上述字符串管理過程可以看出,該現(xiàn)有技術(shù)通過哈希值索引相應的字符串,由于哈希值的長度通常比字符串小得多,而且哈希值長度固定,因此通過哈希值查找字符串的速度要比傳統(tǒng)的字符串查找速度快得多。然而,該方法卻存在著系統(tǒng)內(nèi)存消耗大的弊病,主要原因是不同的CmapStringToPtr類相互獨立,各自管理內(nèi)部的字符串,如果一個相同的字符串提交到兩個CmapStringToPtr類中,則定會在系統(tǒng)內(nèi)存中留下兩個備份,導致系統(tǒng)內(nèi)存的冗佘消耗。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供一種字符串引用方法,解決現(xiàn)有的字符串引用方法所存在的內(nèi)存消耗大的問題。
為了達到上述目的,本發(fā)明提供的字符串引用方法包括預先設(shè)置用于保存字符串哈希值的字符串管理單元,該方法包括如下步驟a、外部功能單元向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請;b、字符串管理單元接收到字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息;c、外部功能單元根據(jù)輸出的引用信息引用字符串。
在上述方法中,所述字符串哈希值是按照由小到大或由大到小的順序保存的;步驟b中,所述從保存的哈希值中查找該計算所得的哈希值的方式為二分法。
在上述方法中,所述引用信息為字符串指針。
在上述方法中,所述步驟b進一步包括當字符串管理單元判定自身保存的哈希值中不存在該計算所得的哈希值時,在自身保存該哈希值,然后執(zhí)行步驟b0;且所述步驟b進一步包括當字符串管理單元判定保存的與該計算所得哈希值相對應的字符串中不存在該申請中所攜帶的字符串時,執(zhí)行步驟b0;b0、為該申請中所攜帶的字符串分配存儲地址,并將該字符串保存于分配的存儲地址中,接著執(zhí)行步驟b中輸出該字符串的字符串指針的步驟。
在上述方法中,進一步包括為保存的字符串設(shè)置標識其引用狀態(tài)的引用計數(shù);所述步驟b進一步包括將字符串的引用計數(shù)加1;所述步驟b0進一步包括為該字符串設(shè)置引用計數(shù),并將該引用計數(shù)的值設(shè)置為1。
在上述方法中,所述步驟c之后進一步包括步驟d、當外部功能單元引用完字符串時,通過向字符串管理單元發(fā)送字符串指針注銷自身對相應字符串的引用;字符串管理單元接收到字符串指針后,根據(jù)該字符串指針從保存的字符串中查找相應的字符串,并將字符串的引用計數(shù)減1。
在上述方法中,所述步驟d之后進一步包括e、字符串管理單元判斷該字符串的引用計數(shù)是否為0,如果是,則結(jié)束本流程;否則,刪除保存的該字符串,結(jié)束本流程。
在上述方法中,所述步驟d進一步包括當字符串管理單元接收到字符串指針后,判定該字符串指針是否合法,如果是,則繼續(xù)執(zhí)行步驟d中根據(jù)該字符串指針查找相應的字符串的步驟;否則,直接結(jié)束本流程。
在上述方法中,所述步驟d進一步包括當字符串管理單元根據(jù)字符串指針查找到字符串后,計算該字符串的哈希值,并查找自身保存的哈希值中是否存在該計算所得的哈希值,如果不存在該計算所得的哈希值,則直接結(jié)束本流程;如果存在該計算所得的哈希值,則進一步查找保存的與該哈希值對應的字符串中是否存在與上述查找到的字符串相同的字符串,如果存在,則繼續(xù)執(zhí)行步驟d中將字符串的引用計數(shù)減1的步驟;如果不存在,則直接結(jié)束本流程。
在上述方法中,步驟c中,所述根據(jù)輸出的引用信息引用字符串包括通過引用信息從字符串的存儲地址引用字符串或者通過比較引用信息實現(xiàn)對相應字符串的比較操作。
綜上所述,本發(fā)明方法采取預先設(shè)置用于存儲字符串哈希值的字符串管理單元;當外部功能單元需要使用字符串時,向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請;字符串管理單元接收到字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息;外部功能單元根據(jù)輸出的引用信息引用字符串。
由于字符串索引和存貯皆由字符串管理單元負責,因此外部功能單元在使用字符串時,只須向字符串管理單元申請引用相應的字符串,而當外部功能單元引用完該字符串時,則向字符串管理單元申請注銷對該字符串的引用,這樣相同的字符串在系統(tǒng)內(nèi)存中只保存一份,從而實現(xiàn)了合并字符串占用空間的目的。而且在字符串管理單元內(nèi)部采取排序的方式保存哈希值,從而可以通過二分法查找哈希值,加快了哈希值的查找速度,進而提高了利用哈希值查找字符串的速度,最終保證了字符串的引用速度。而在字符串管理單元外部,當涉及比較字符串的操作時,由于相同的字符串只有一個字符串指針,因此只需比較相應的字符串指針就可實現(xiàn)字符串比較的目的,從而實現(xiàn)在保證字符串引用速度的同時,優(yōu)化字符串存貯,節(jié)約系統(tǒng)內(nèi)存,優(yōu)化字符串比較操作,降低對系統(tǒng)CPU占用的目的。
圖1為現(xiàn)有技術(shù)字符串引用方法的方法流程圖。
圖2為本發(fā)明字符串引用方法的方法流程圖。
圖3為本發(fā)明字符串引用方法中的字符串申請流程圖。
圖4為本發(fā)明字符串引用方法中的字符串注銷流程圖。
具體實施例方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面結(jié)合附圖對本發(fā)明作進一步的詳細描述。
本發(fā)明方法的核心思想是預先設(shè)置用于存儲字符串哈希值的字符串管理單元;當外部功能單元需要引用字符串時,向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請;字符串管理單元接收到字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從系統(tǒng)內(nèi)存中保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息;外部功能單元根據(jù)輸出的引用信息引用字符串。從而實現(xiàn)在保證字符串引用速度的同時,優(yōu)化字符串存貯,節(jié)約系統(tǒng)內(nèi)存,優(yōu)化字符串比較,降低CPU占用的目的。
下面通過具體實施例詳細說明本發(fā)明方法,實現(xiàn)該方法的前提條件是預先設(shè)置一個字符串管理單元,并在該字符串管理單元中保存一個用于存放與字符串相關(guān)數(shù)據(jù)項的數(shù)據(jù)庫表;其中,與字符串相關(guān)的數(shù)據(jù)項具體包括哈希值和字符串表,哈希值與字符串表一一對應,而字符串表則用于存儲與該哈希值對應的字符串指針,并且保存的哈希值是按照由小到大或者由大到小的順序排列的,數(shù)據(jù)庫表最初是一個空表。該方法流程如圖2所示,具體包括如下步驟步驟201當外部功能單元需要引用字符串時,向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請。
其中,外部功能單元向字符串管理單元申請字符串的具體步驟包括外部功能單元根據(jù)所需字符串的內(nèi)容生成相應的字符串,然后將該字符串作為參數(shù)向字符串管理單元申請字符串對象。
步驟202字符串管理單元接收到該字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從系統(tǒng)內(nèi)存中保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息,即字符串指針。該步驟的具體執(zhí)行過程請參見后續(xù)步驟301至306。
此處,由于字符串指針就是字符串在內(nèi)存中的地址,因此輸出字符串指針實質(zhì)上是將保存字符串的地址輸出至外部功能單元。
步驟203外部功能單元接收到字符串管理單元輸出的字符串指針后,保存相應的字符串指針,并根據(jù)保存的字符串指針進行相應的字符引用操作,如字符串比較等。
其中,由于相同的字符串只會保存于一個地址中,因此字符串與字符串指針實質(zhì)上是一一對應的關(guān)系,當外部功能單元需要進行字符串比較操作時,只需間接比較相應的字符串指針是否相同,如果字符串指針相同,則表明待比較字符串是相同的;否則,表明為不同的字符串。然而當直接涉及字符串內(nèi)容的操作時,則需首先通過字符串指針從內(nèi)存中調(diào)用相應的字符串,然后才能引用該字符串。
而且,由于一般的字符串長度通常為十幾個字節(jié),而字符串指針的長度僅為4個字節(jié),因此相對于字符串來講,字符串指針占用的內(nèi)存空間要小得多。從而當外部功能單元在引用字符串的過程中,保存字符串指針要比保存相應的字符串節(jié)省很大的內(nèi)存空間。相對于現(xiàn)有技術(shù)中,在外部功能單元保存關(guān)聯(lián)串,而在CmapStringToPtr類中保存母串和關(guān)聯(lián)串來講,本發(fā)明只需在外部功能單元保存相應的字符串指針無疑大大節(jié)約了系統(tǒng)內(nèi)存空間。
步驟204當外部功能單元引用完字符串時,通過向字符串管理單元發(fā)送字符串指針注銷自身對相應字符串的引用;字符串管理單元根據(jù)該申請注銷對該字符串的引用。該步驟的具體執(zhí)行過程請參見后續(xù)步驟401至407。
下面說明上述步驟202,該步驟流程如圖3所示,具體包括如下步驟步驟301當字符串管理單元接收到外部功能單元的字符串引用申請后,計算申請中所攜帶字符串的哈希值。
其中,字符串的哈希值是通過對字符串包含的所有字符進行數(shù)學變換得到。舉例來說一個字符串包括字符a和字符b,而在系統(tǒng)內(nèi)部,a用97表示,b用98表示,如果通過加法進行數(shù)學變換,則該字符串的哈希值為97+98=195,如果通過乘法進行數(shù)學變換,則該字符串的哈希值為97*98=9506。由于數(shù)學變換的方式不止一種,相應地,字符串的哈希值也就有多種計算方法,然而在一個固定的程序中,只能采取一種固定算法,從而保證相同的字符串只可能有一個哈希值。
步驟302通過二分法查找自身保存的哈希值中是否存在該計算所得的哈希值,如果是,則執(zhí)行步驟303;否則,執(zhí)行步驟304。
其中,由于保存的所有哈希值是按照由小到大或由大到小的順序排列的,所以可以采用二分法查找哈希值,而具體查找方法為首先將待查找字符串的哈希值與保存的最大哈希值和最小哈希值分別進行比較,判斷該哈希值是否大于最小值且小于最大值,如果是,則進一步將待比較的哈希值同保存的所有哈希值的中間值進行比較,逐步縮小該哈希值的查找范圍,從而最終確定保存的哈希值中是否存在待比較的哈希值。本發(fā)明中,對哈希值排序并采用二分法查找哈希值的方法相對于現(xiàn)有技術(shù)中對哈希值進行分組的方法具有兩個優(yōu)點,第一,查找速度更快;第二,占用的內(nèi)存空間少。
步驟303根據(jù)該哈希值查找相應的字符串表,然后查找字符串表中的所有字符串指針指示的存儲地址中是否保存有相應的字符串,如果是,則執(zhí)行步驟306;否則,執(zhí)行步驟305。
在上述步驟中,由于不同字符串的哈希值可能相同,因此查找到的哈希值可能對應多個字符串,但在大多數(shù)情況下,它們是一一對應的。
而查找字符串的具體方式為將申請的字符串與相應的每個存儲地址中保存的字符串逐一進行比較,并逐一比較每個字符串的組成字符。需要注意的是盡管此處仍然采用最原始的逐一比較每個字符串的組成字符的方法查找字符串,但由于預先已經(jīng)根據(jù)哈希值進行過篩選,因此查找字符串所需比較的次數(shù)會大大減少,而且在大多數(shù)情況下,由于一個哈希值只對應一個字符串,往往只需比較一次。
步驟304保存該哈希值,為該申請中所攜帶的字符串在系統(tǒng)內(nèi)存中分配存儲地址,然后將該字符串保存于分配的存儲地址中,并創(chuàng)建一個與該哈希值對應的空字符串表,然后將指示該字符串存儲地址的字符串指針添加至該空字符串表中,為該字符串指針設(shè)置標識外部引用狀態(tài)的引用計數(shù),并將該引用計數(shù)的值設(shè)置為1,最后輸出該字符串指針,結(jié)束本流程。
步驟305為該字符串在系統(tǒng)內(nèi)存中分配存儲地址,然后將相應的字符串保存于該存儲地址中,并將指示該存儲地址的字符串指針添加至保存的與該哈希值對應的字符串表中,然后為該字符串指針設(shè)置標識外部引用狀態(tài)的引用計數(shù),并將該引用計數(shù)的值設(shè)置為1,最后輸出該字符串指針,結(jié)束本流程。
其中,哈希值與字符串表可以通過數(shù)據(jù)結(jié)構(gòu)體的方式進行關(guān)聯(lián),如字符串表可以緊跟在哈希值的后邊或者位于哈希值前邊。
步驟306將設(shè)置的標識該字符串引用狀態(tài)的引用計數(shù)加1,然后輸出該字符串指針。
下面說明上述步驟204,該步驟流程如圖4所示,具體包括如下步驟步驟401當外部功能單元引用完字符串后,則通過向字符串管理單元發(fā)送字符串指針申請注銷自身對相應字符串的引用。
步驟402字符串管理單元接收到該字符串指針后,查找該字符串指針所指示的存儲地址中是否保存有字符串,如果是,則執(zhí)行步驟403;否則,執(zhí)行步驟407;步驟403計算查找到的字符串的哈希值,然后通過二分法從自身保存的所有哈希值中查找是否存在該計算所得的哈希值,如果是,則執(zhí)行步驟404;否則,執(zhí)行步驟407。
步驟404查找自身保存的與該哈希值對應的字符串表,判斷該字符串表中所有字符串指針所指示的存儲地址中是否保存有該查找到的字符串,如果是,則執(zhí)行步驟405;否則,執(zhí)行步驟407。
步驟405將該字符串的引用計數(shù)減去1,表示該字符串的外部引用又減少一個,然后判斷該字符串的引用計數(shù)是否為0,如果是,則執(zhí)行步驟406;否則,執(zhí)行步驟407。
步驟406刪除系統(tǒng)內(nèi)存中保存的該字符串,結(jié)束本流程。
步驟407直接結(jié)束本流程。
在上述字符串注銷流程中,采取通過字符串指針查找相應字符串,接著根據(jù)查找到的字符串計算相應的哈希值,然后根據(jù)該計算所得的哈希值查找相應字符串,最后注銷對查找到字符串的引用的過程,是為了對該字符串指針的合法性進行驗證,從而保證字符串不被誤刪掉。原因是外部功能單元輸入字符串管理單元的指針并不一定是合法的指針,這樣當出現(xiàn)字符串管理單元接收到一個錯誤的指針,而又恰好根據(jù)該指針查找到了與該指針對應的一個字符串的情況時,字符串管理單元并不會因為查找到了與該字符串指針對應的字符串,就直接將該字符串注銷,而是會通過后續(xù)的一系列諸如計算哈希值,查找哈希值,以及通過哈希值查找字符串的步驟來進一步驗證該字符串指針是否為真實的字符串指針,從而大大降低字符串管理單元根據(jù)外部輸入的假指針刪除其它功能單元申請的字符串的概率,提高了字符串管理的可靠性。
當然,上述通過該字符串指針查找相應字符串的過程只是本發(fā)明的一個較佳實施例而已,本發(fā)明也可采用字符串管理單元根據(jù)接收到的字符串指針直接查找是否存在與該指針對應的字符串,如果是,則刪除該字符串;否則,直接結(jié)束本流程的方式。
總之,以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。
權(quán)利要求
1.一種字符串引用方法,其特征在于,該方法包括預先設(shè)置用于保存字符串哈希值的字符串管理單元,該方法包括如下步驟a、外部功能單元向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請;b、字符串管理單元接收到字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息;c、外部功能單元根據(jù)輸出的引用信息引用字符串。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述字符串哈希值是按照由小到大或由大到小的順序保存的;步驟b中,所述從保存的哈希值中查找該計算所得的哈希值的方式為二分法。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述引用信息為字符串指針。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述步驟b進一步包括當字符串管理單元判定自身保存的哈希值中不存在該計算所得的哈希值時,在自身保存該哈希值,然后執(zhí)行步驟b0;且所述步驟b進一步包括當字符串管理單元判定保存的與該計算所得哈希值相對應的字符串中不存在該申請中所攜帶的字符串時,執(zhí)行步驟b0;b0、為該申請中所攜帶的字符串分配存儲地址,并將該字符串保存于分配的存儲地址中,接著執(zhí)行步驟b中輸出該字符串的字符串指針的步驟。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,該方法進一步包括為保存的字符串設(shè)置標識其引用狀態(tài)的引用計數(shù);所述步驟b進一步包括將字符串的引用計數(shù)加1;所述步驟b0進一步包括為該字符串設(shè)置引用計數(shù),并將該引用計數(shù)的值設(shè)置為1。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述步驟c之后進一步包括步驟d、當外部功能單元引用完字符串時,通過向字符串管理單元發(fā)送字符串指針注銷自身對相應字符串的引用;字符串管理單元接收到字符串指針后,根據(jù)該字符串指針從保存的字符串中查找相應的字符串,并將字符串的引用計數(shù)減1。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述步驟d之后進一步包括e、字符串管理單元判斷該字符串的引用計數(shù)是否為0,如果是,則結(jié)束本流程;否則,刪除保存的該字符串,結(jié)束本流程。
8.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述步驟d進一步包括當字符串管理單元接收到字符串指針后,判定該字符串指針是否合法,如果是,則繼續(xù)執(zhí)行步驟d中根據(jù)該字符串指針查找相應的字符串的步驟;否則,直接結(jié)束本流程。
9.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述步驟d進一步包括當字符串管理單元根據(jù)字符串指針查找到字符串后,計算該字符串的哈希值,并查找自身保存的哈希值中是否存在該計算所得的哈希值,如果不存在該計算所得的哈希值,則直接結(jié)束本流程;如果存在該計算所得的哈希值,則進一步查找保存的與該哈希值對應的字符串中是否存在與上述查找到的字符串相同的字符串,如果存在,則繼續(xù)執(zhí)行步驟d中將字符串的引用計數(shù)減1的步驟;如果不存在,則直接結(jié)束本流程。
10.根據(jù)權(quán)利要求1至9中任意一項所述的方法,其特征在于,步驟c中,所述根據(jù)輸出的引用信息引用字符串包括通過引用信息從字符串的存儲地址引用字符串或者通過比較引用信息實現(xiàn)對相應字符串的比較操作。
全文摘要
本發(fā)明公開了一種字符串引用方法,該方法包括預先設(shè)置用于保存字符串哈希值的字符串管理單元;當外部功能單元引用字符串時,向字符串管理單元發(fā)送攜帶相應字符串的字符串引用申請;字符串管理單元接收到字符串引用申請后,計算申請中所攜帶字符串的哈希值,然后從自身保存的哈希值中查找該計算所得的哈希值,接著從保存的與該計算所得哈希值相對應的字符串中查找該申請中所攜帶的字符串,并輸出該字符串的引用信息;外部功能單元根據(jù)輸出的引用信息引用字符串。從而實現(xiàn)在保證字符串調(diào)用速度的同時,優(yōu)化字符串存貯,節(jié)約系統(tǒng)內(nèi)存,優(yōu)化字符串比較,降低CPU占用的目的。
文檔編號G06F9/44GK1866203SQ20051007119
公開日2006年11月22日 申請日期2005年5月20日 優(yōu)先權(quán)日2005年5月20日
發(fā)明者李訓耕 申請人:騰訊科技(深圳)有限公司