91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Golang哈希算法實現配置文件的監控功能

發布時間:2023-03-08 10:37:00 來源:億速云 閱讀:102 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用Golang哈希算法實現配置文件的監控功能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用Golang哈希算法實現配置文件的監控功能”文章能幫助大家解決問題。

    SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本,用于數據摘要和認證。哈希和加密類似,唯一區別是哈希是單項的,即哈希后的數據無法解密。SHA有不同的算法,主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, and SHA-384等,其中SHA-256是SHA-2家族的一個成員,它把原數據轉為256字節固定長度摘要信息,SHA256的內部塊大小為32位。

    Golang hash356實現包

    hash356包實現了FIPS 180-4規范中定義的SHA224、SHA256哈希算法。主要包括下面幾個函數:

    func New() hash.Hash: 返回 hash.Hash,用于計算SHA256哈希值。

    func Sum256(data []byte) [Size]byte :返回計算SHA256的哈希值。

    使用sha256.New()

    下面示例使用New()函數返回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))
    }

    過程很簡單,運行輸出結果:

    289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e

    使用sha256.Sum256()函數

    package main
    import (
    	"crypto/sha256"
    	"fmt"
    )
    func main() {
    	sum := sha256.Sum256([]byte("this is a password"))
    	fmt.Printf("%x", sum)
    }

    更簡潔,輸出結果一樣。

    下面示例展示兩個字符串,盡管只有一個字符微小差異,但生成的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)
    }

    運行輸出結果:

    lowercase hash: 289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e
    Capital   hash: 9ae12b1403d242c53b0ea80137de34856b3495c3c49670aa77c7ec99eadbba6e

    怎么使用Golang哈希算法實現配置文件的監控功能

    監控配置文件變化

    我們需要觀察文件是否變化,標準實現使用time.Ticker每隔幾秒重新計算配置文件的哈希值,如果哈希值發生變化,則重新加載。

    獲取配置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創建hash.Hash對象

    • 解析文件內容到hash對象

    • 調用Sum方法獲得hash值

    上面示例中test測試文件,可以隨便輸入一些內容,生成文件hash值。

    下面實現比較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值用于下一次比較,同時調用RefreshCfg()方法,該方法是具體業務實現,這里僅給出空實現:

    func RefreshCfg() {
    	fmt.Println(" refresh config information.")
    }

    最后是main函數部分:

    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...")
    		}
    	}
    }

    首先保存當前配置文件的Hash值。然后利用Ticker每2秒比較一次比較。運行程序修改配置文件,可以立刻看到程序監控到變化并調用RefreshCfg方法。

    下面給出完整代碼實現:

    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
    }

    關于“怎么使用Golang哈希算法實現配置文件的監控功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    广汉市| 乌海市| 岳池县| 吉木萨尔县| 仁布县| 当雄县| 平南县| 三门县| 南澳县| 蓬莱市| 屏边| 德阳市| 岗巴县| 浮山县| 北碚区| 马山县| 唐海县| 迁西县| 洛川县| 大荔县| 龙南县| 宣恩县| 道孚县| 新邵县| 子长县| 大荔县| 尼勒克县| 沿河| 大化| 健康| 正宁县| 鲁山县| 孙吴县| 彰武县| 永修县| 渝中区| 汶上县| 嘉善县| 尖扎县| 肇州县| 峨眉山市|