最近換工作,暫時離開了世界上最好的語言,成為了一名 golanger (這好象是乙個 web 框架的名字),這一次打算養成良好的習慣,那就從寫部落格開始吧。
正在琢磨自己用 go 實現乙個指令碼語言,寫詞法分析的時候,需要匹配字串的功能,既然編譯器都自己寫了,這也自己寫乙個吧,去研究了下 go 的實現,發現設計的很巧妙,所以分享一下,美中不足的是只適用於 ascii 碼
type asciiset [8]
uint32
const runeself =
0x80
// 判斷是否包含
func
(as *asciiset)
contains
(c rune
)bool
// 生成 ascii 雜湊表
func
makeasciiset
(chars string
)(as asciiset, ok bool
) as[c>>5]
|=1<<
uint
(c&31)}
return as,
true
}
type asciiset [8]
uint32
asciiset
這是乙個分了 8 個桶的雜湊表(位圖),用於儲存匹配串包含的字元集合
匹配串輸入後,將會被按位儲存在asciiset
。
下面這行**,會對所有包含非 asci
i字元的串直接返回false
。
if c >= utf8.runeself
下面這行**可以看作乙個雜湊演算法。
1
<<
uint
(c&31
)
會把單個字元對應到乙個 32位 的點陣圖上面,
(as[c>>5]
&(1<<
uint
(c&31))
)!=0
從字元對應的桶中取出位圖,然後檢視是否存在
asciiset
是其中的關鍵,但是也由於其大小限制加上以為操作,導致只適用於基礎ascii,
當然,稍作修改可以適用於擴充套件 ascii,但泛用性依然有問題,不過對於我來說已然足夠。
原始碼分享 HOOK API
此原始碼以hook自己程式中的messageboxw函式為例 然而hook自己程式中的函式並沒有什麼卵用,但是對想學習hook技術卻難以入門的人來說是乙個很大的幫助 如果需要hook其他程序的api的話還需要學習關於dll注入等相關知識 本原始碼是根據 改寫原文是使用了彙編語句,呃,在qt中一直沒找...
mysql原始碼包多大 MySQL原始碼包安裝
root node2 groupadd g 27 mysql root node2 useradd u 27 mysql g mysql s sbin nologin root node2 yum y install make cmake bison gcc c cmake ncurses ncur...
原始碼包安裝mysql 原始碼包安裝MySQL
mysql安裝方式 1.二進位制安裝2.原始碼包安裝3.rpm包安裝 一.原始碼包安裝 原始碼包安裝比較繁瑣,但是更加靈活,可以按自己需求配置 root db03 wget 2.安裝需要的依賴包 root db03 yum install y ncurses devel libaio devel g...