Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能詳解
SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本,用于數(shù)據(jù)摘要和認證。哈希和加密類似,唯一區(qū)別是哈希是單項的,即哈希后的數(shù)據(jù)無法解密。SHA有不同的算法,主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, and SHA-384等,其中SHA-256是SHA-2家族的一個成員,它把原數(shù)據(jù)轉(zhuǎn)為256字節(jié)固定長度摘要信息,SHA256的內(nèi)部塊大小為32位。本文介紹Golang如何使用sha256算法實現(xiàn)對配置文件的監(jiān)控。
Golang hash256實現(xiàn)包
hash256包實現(xiàn)了FIPS 180-4規(guī)范中定義的SHA224、SHA256哈希算法。主要包括下面幾個函數(shù):
func New() hash.Hash
: 返回 hash.Hash,用于計算SHA256哈希值。
func Sum256(data []byte) [Size]byte
:返回計算SHA256的哈希值。
使用sha256.New()
下面示例使用New()函數(shù)返回Hash.hash:
package main import ( "crypto/sha256" "fmt" ) func main() { h := sha256.New() h.Write([]byte("this is a password")) // Calculate and print the hash fmt.Printf("%x", h.Sum(nil)) }
過程很簡單,運行輸出結(jié)果:
289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e
使用sha256.Sum256()函數(shù)
package main import ( "crypto/sha256" "fmt" ) func main() { sum := sha256.Sum256([]byte("this is a password")) fmt.Printf("%x", sum) }
更簡潔,輸出結(jié)果一樣。
下面示例展示兩個字符串,盡管只有一個字符微小差異,但生成的hash卻完全不同:
package main import ( "crypto/sha256" "fmt" ) func main() { sum := sha256.Sum256([]byte("this is a password")) sumCap := sha256.Sum256([]byte("This is a password")) fmt.Printf("lowercase hash: %x", sum) fmt.Println("") fmt.Printf("Capital hash: %x", sumCap) }
運行輸出結(jié)果:
lowercase hash: 289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e
Capital hash: 9ae12b1403d242c53b0ea80137de34856b3495c3c49670aa77c7ec99eadbba6e
監(jiān)控配置文件變化
我們需要觀察文件是否變化,標(biāo)準(zhǔn)實現(xiàn)使用time.Ticker每隔幾秒重新計算配置文件的哈希值,如果哈希值發(fā)生變化,則重新加載。
獲取配置hash值
func getCfgHash() string { file, err := os.Open("test.cfg") defer file.Close() if err != nil { panic(err) } hash := sha256.New() if _, err := io.Copy(hash, file); err != nil { panic(err) } sum := fmt.Sprintf("%x", hash.Sum(nil)) return sum }
上面方法步驟:
- 打開配置文件
- 從crypto/sha256創(chuàng)建hash.Hash對象
- 解析文件內(nèi)容到hash對象
- 調(diào)用Sum方法獲得hash值
上面示例中test測試文件,可以隨便輸入一些內(nèi)容,生成文件hash值。
下面實現(xiàn)比較hash值方法:
func compare(new string) bool { var oldStr = "" oldFile, _ := os.Open("tmp.hash") oldBytes, _ := io.ReadAll(oldFile) oldStr = string(oldBytes) oldFile.Close() if oldStr != new { newFile, _ := os.Create("tmp.hash") fmt.Println("new hash:", new) newFile.WriteString(new) RefreshCfg() return false } return true }
先加載上一次保存的配置文件hash值,與本次傳入最新hash值進行比較,如不同則保存最新hash值用于下一次比較,同時調(diào)用RefreshCfg()方法,該方法是具體業(yè)務(wù)實現(xiàn),這里僅給出空實現(xiàn):
func RefreshCfg() { fmt.Println(" refresh config information.") }
最后是main函數(shù)部分:
func main() { // 先記錄配置文件hash值 cfgHash := getCfgHash() fmt.Println("cfg hash:", cfgHash) file, _ := os.Create("tmp.hash") file.WriteString(cfgHash) file.Close() // define an interval and the ticker for this interval interval := time.Duration(2) * time.Second // create a new Ticker tk := time.NewTicker(interval) // start the ticker by constructing a loop for range tk.C { fmt.Println("time running...") loadStr := getCfgHash() if !compare(loadStr) { fmt.Println("config file has changed...") } } }
首先保存當(dāng)前配置文件的Hash值。然后利用Ticker每2秒比較一次比較。運行程序修改配置文件,可以立刻看到程序監(jiān)控到變化并調(diào)用RefreshCfg方法。
下面給出完整代碼實現(xiàn):
package main import ( "crypto/sha256" "time" "fmt" "io" "os" ) func main() { // 先記錄配置文件hash值 cfgHash := getCfgHash() fmt.Println("cfg hash:", cfgHash) file, _ := os.Create("tmp.hash") file.WriteString(cfgHash) file.Close() // define an interval and the ticker for this interval interval := time.Duration(2) * time.Second // create a new Ticker tk := time.NewTicker(interval) // start the ticker by constructing a loop for range tk.C { fmt.Println("time running...") loadStr := getCfgHash() if !compare(loadStr) { fmt.Println("config file has changed...") } } } func RefreshCfg() { fmt.Println(" refresh config information.") } func getCfgHash() string { file, err := os.Open("test.cfg") defer file.Close() if err != nil { panic(err) } hash := sha256.New() if _, err := io.Copy(hash, file); err != nil { panic(err) } sum := fmt.Sprintf("%x", hash.Sum(nil)) return sum } func compare(new string) bool { var oldStr = "" oldFile, _ := os.Open("tmp.hash") oldBytes, _ := io.ReadAll(oldFile) oldStr = string(oldBytes) oldFile.Close() if oldStr != new { newFile, _ := os.Create("tmp.hash") fmt.Println("new hash:", new) newFile.WriteString(new) RefreshCfg() return false } return true }
總結(jié)
數(shù)據(jù)加密算法規(guī)范非常復(fù)雜,在大多數(shù)應(yīng)用場景中需要廣泛研究。但Golang提供了專門的庫,實現(xiàn)了許多流行的加密算法。本文演示了如何使用crypto/sha256
對配置文件進行監(jiān)控,變化則重新加載配置文件。
到此這篇關(guān)于Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能詳解的文章就介紹到這了,更多相關(guān)Golang哈希算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Golang如何實現(xiàn)一個環(huán)形緩沖器
環(huán)形緩沖器(ringr?buffer)是一種用于表示一個固定尺寸、頭尾相連的緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),適合緩存數(shù)據(jù)流。本文將利用Golang實現(xiàn)一個環(huán)形緩沖器,需要的可以參考一下2022-09-09Golang?range?slice?與range?array?之間的區(qū)別
這篇文章主要介紹了Golang?range?slice?與range?array?之間的區(qū)別,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07Golang try catch與錯誤處理的實現(xiàn)
社區(qū)不少人在談?wù)?nbsp;golang 為毛不用try/catch模式,而采用苛刻的recovery、panic、defer組合,本文就來詳細的介紹一下,感興趣的可以了解一下2021-07-07Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例
這篇文章主要介紹了Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例,Gocache是一個基于Go語言編寫的多存儲驅(qū)動的緩存擴展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下2022-09-09golang使用map支持高并發(fā)的方法(1000萬次操作14ms)
這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬次操作14ms),本文給大家詳細講解,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11