北京建筑设计院待遇好吗/seo推广优势
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如何使用sha256算法实现对配置文件的监控。
Golang hash256实现包
hash256包实现了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 mainimport ("crypto/sha256""fmt"
)func main() {h := sha256.New()h.Write([]byte("this is a password"))// Calculate and print the hashfmt.Printf("%x", h.Sum(nil))
}
过程很简单,运行输出结果:
289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e
使用sha256.Sum256()函数
package mainimport ("crypto/sha256""fmt"
)func main() {sum := sha256.Sum256([]byte("this is a password"))fmt.Printf("%x", sum)
}
更简洁,输出结果一样。
下面示例展示两个字符串,尽管只有一个字符微小差异,但生成的hash却完全不同:
package mainimport ("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
监控配置文件变化
我们需要观察文件是否变化,标准实现使用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 intervalinterval := time.Duration(2) * time.Second// create a new Tickertk := time.NewTicker(interval)// start the ticker by constructing a loopfor range tk.C {fmt.Println("time running...")loadStr := getCfgHash()if !compare(loadStr) {fmt.Println("config file has changed...")}}
}
首先保存当前配置文件的Hash值。然后利用Ticker每2秒比较一次比较。运行程序修改配置文件,可以立刻看到程序监控到变化并调用RefreshCfg方法。
下面给出完整代码实现:
package mainimport ("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 intervalinterval := time.Duration(2) * time.Second// create a new Tickertk := time.NewTicker(interval)// start the ticker by constructing a loopfor 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提供了专门的库,实现了许多流行的加密算法。本文演示了如何使用crypto/sha256
对配置文件进行监控,变化则重新加载配置文件。
相关文章:

基于Golang哈希算法监控配置文件变化
SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本,用于数据摘要和认证。哈希和加密类似,唯一区别是哈希是单项的,即哈希后的数据无法解密。SHA有不同的算法,主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, …...

关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)
前言这是一个经典的图论问题了最近复习离散的时候又恰好看到了,发现自己以前的解法似乎有点bug然后开始出反例卡自己,结果发现卡不掉?然后再好好想了想,发现这个看起来有问题的做法可能确实没问题。注意:欧拉路、欧拉回…...

vlookup怎么用详细步骤,看这一篇就够了
1、vlookup函数:使用方法 以下便是vlookup函数,功能、语法和参数用法: excel函数vlookup 2、vlookup函数:查询参数 首先,选中F2单元格,然后在编辑栏输入函数公式:VLOOKUP(E2,B&…...

雅思经验(9)之小作文常用词汇总结
写作:关于趋势的上升和下降在小作文中,真的是非常常见的,所以还是要积累一下。下面给出了很多词,但是在雅思写作中并不是词越丰富,分数就越高的。雅思写作强调的是准确性:在合适的地方用合适的词和句法。不…...

【Python语言基础】——Python NumPy 数组创建
Python语言基础——Python NumPy 数组创建 文章目录 Python语言基础——Python NumPy 数组创建一、Python NumPy 数组创建一、Python NumPy 数组创建 创建 NumPy ndarray 对象 NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。 我们可以使用 array() 函数创建一个 NumP…...

【大数据】Hadoop-Kms 安装及相关详细配置,看完你就会了
简介 Hadoop KMS是基于Hadoop的KeyProvider API的加密密钥管理服务器,它提供了使用REST API通过HTTP进行通信的客户端和服务器组件。 客户端是一个KeyProvider实现,使用KMS HTTP REST API与KMS交互。 KMS及其客户端具有内置的安全性,它们支…...

SpringCloud分布式框架
SpringCloud分布式框架 SpringCloud框架 Spring Cloud 是一个用于创建分布式系统的开源框架。它基于 Spring Boot 和 Spring Framework,提供了一整套关于分布式系统的工具和技术。 Spring Cloud 是微服务架构的一种实现方式,它提供了一整套完整的技术…...

Csss属性display,visibility区别,对渲染页面的影响
display: none; 与 visibility: hidden; 的区别 相同: 它们都能让元素不可见 区别:display:none;会让元素完全从渲染树中消失,渲染的时候不占据任何空间; visibility: hidden;不会让元素从渲染树消失,渲染时元素继续…...

怎么给笔记本电脑外接两台显示器?
我们在办公室会看见不少同事的电脑不止一台显示器,多屏确实可以提高工作效率。有的游戏党也会选择给电脑外接显示器,带来绝佳的体验。 不过要怎么把将外部显示器连接到笔记本电脑上?驱动人生在这里教给大家给笔记本外接显示器的做法。 一、…...

生成树协议 — STP
目录 一、环路的出现 1、广播风暴: 2、MAC地址表翻滚: 二、生成树 1、定义: 2、生成树使用的算法: 三、802.1D 1、BPDU: 2、TCN—拓扑变更消息(也是BPDU): 3、部分名词&am…...

git必会的知识点
注:本文参考https://www.liaoxuefeng.com/wiki/896043488029600 原文非常值得一读,作者学识渊博,补充了很多有意思的知识。我仅仅是拾人牙慧。 git是最先进的分布式版本控制系统。 版本控制系统——自动记录系统中文件的改动情况࿰…...

【hello, world】计算机系统漫游
文章目录hello程序信息就是位 上下文程序被其他程序翻译成不同的格式预处理阶段编译阶段汇编阶段链接阶段了解编译系统如何工作是大有益处的优化程序性能理解链接时出现的错误避免安全漏洞处理器读并解释储存在内存中的指令系统的硬件组成总线I/O设备主存处理器运行hello程序高…...

1. SpringMVC 简介
文章目录1. SpringMVC 概述2. SpringMVC 入门案例2.1 入门案例2.2 入门案例工作流程3. bean 加载控制4. PostMan 工具1. SpringMVC 概述 SpringMVC 与 Servlet 功能等同,均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。 对于 SpringMVC,主…...

《解谜三星堆:开启中华文明之门》-范勇 笔记
甲篇 应重视民间流传的疑似三星堆的文物,对其展开充分的研究,以发现更多关于三星堆的秘密,并且避免“敦煌窘境”,让我国的三星堆学术研究处于世界领先地位!(书中就讲到了在民间首次发现了圆形玉器…...

锐捷(十四)mpls vxn optionc的关键问题所在和具体问题分析
用锐捷的设备搭建mpls vxn optionc的基础版和带RR的版本,在控制平面和转发平免上分析mpls vxn optionc的关键问题所在和具体问题分析。一 基础mpls vxn optionc:核心:两pe之间之间建立MP EBGP邻居,从而直接传递路由解放了ASBR。关…...

Python语言零基础入门教程(十四)
Python 日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜(历元&…...

Https 协议超强讲解(一)
都说Https协议非常安全,那为什么还是会被抓包呢?抓包后会影响什么吗? HTTPS协议 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关…...

5.Redis 实现点赞 优化登陆(验证码 token..)
Redis(1)简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中,性能高。(2&#…...

scscanner:一款功能强大的大规模状态码扫描工具
关于scscanner scscanner是一款功能强大的大规模状态码扫描工具,该工具可以帮助广大研究人员从一个URL列表文件中批量读取目标网站的状态码响应信息。除此之外,该工具还可以过滤出指定的状态码,并将结果存储到一个文件中以供后续深入分析使用…...

Word 和 LaTeX 文档相互转换
Word 和 LaTeX 文档相互转换 目前可以找到两种工具完成将 LaTeX\LaTeXLATEX 文档向 Word 文档的转换, 分别为 Tex2Word和LaTeX-to-Word。 Tex2Word 安装Tex2Word后, 启动 Word, 打开你要转换的 LaTeX\LaTeXLATEX 源文件 (注意,如果没有成功安装 Tex2Word,那么你无法读取…...

python自动发送邮件实现
目录1 前言2 准备工作2.1 电子邮件的基础知识。2.2 python邮件库2.3 邮箱设置3 python实现邮件自动发送3.1 SMTP()和send()方法介绍3.2 python实现实例参考信息1 前言 python功能强大,可以实现我们日常办公的很多任务。诸如批量处理word,excel,pdf等等文件…...

ccc-Classification-李宏毅(4)
文章目录Classification 概念Example ApplicationHow to do ClassificationWhy not RegesssionProbability from Class - FeatureProbability from ClassHow’s the results?Modifying ModelThree StepsProbability DistributionClassification 概念 本质是找一个函数&#x…...

Kubernetes + Docker 部署一个yolov5检测服务(基于FastDeploy)
Kubernetes Docker 从零部署一个yolov5检测服务,服务基于PaddlePaddle/FastDeploy的服务化部署;所有软件从零安装。 文章目录1.说明2.环境3.安装过程 3.1安装 Docker 3.2安装 minikube 3.3安装 Kubectl4.部署过程 4.1 Docker相关 4.2 k8s相关 4.3 启动服…...

【C++/QT】QT5.6解析Excel教程(qtxlsx)
这里写目录标题【背景】【下载qtxlsx】【安装perl】【编译qtxlsx】【添加模块】【使用qtxlsx】【背景】 新接触QT,很多东西都不会,刚接触一个解析Excel的demo,记录一下安装、编译、解析Excel的过程 【下载qtxlsx】 在解析之前,…...

C++之智能指针
前言普通指针的不足new和new门的内存需要用delete和delete[释放。程序员的主观失误,忘了或漏了释放程序员也不确定何时释放(例如多个线程共享同一个对象,没办法确定什么时候释放)普通指针的释放类内的指针,在析构函数中…...

Redis实战-session共享之修改登录拦截器
在上一篇中Redis实战之session共享,我们知道了通过Redis实现session共享了,那么token怎么续命呢?怎么刷新用户呢?本来咱们就通过拦截器来实现这两个功能。 登录拦截器优化: 先来看看现在拦截器情况: 拦截…...

数据可视化,流程化处理pycharts-
本文直接进入可视化,输入讲解输入列表生成图片,关于pandas操作看这篇pandas matplotlib 导包后使用 import matplotlib.pyplot as plt饼图 使用 plt.figure 函数设置图片的大小为 15x15 使用 plt.pie 函数绘制饼图,并设置相关的参数&…...

1626_MIT 6.828 lab1课程大纲学习过程整理
全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 现在lab1的内容全都学习完了,该做的练习也都做了。接下来,整理一下自己看这一部分课程讲义的一些笔记。 整理之前,先把自己完成…...

12月无情被辞:想给还不会自动化测试的技术人提个醒
公司前段时间缺人,也面了不少测试,结果竟没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但是平均水平很让人失望。基本能用一句话概括就是:3年测…...

开发必备技术--docker(使用篇)
文章目录前言Docker的基本概念概念数据卷虚拟网络镜像操作镜像名称镜像命令容器操作基本操作容器创建数据卷操作创建和查看数据卷其他指令实战前言 续接上一篇博文: 开发必备技术–docker(一) 这也是开学了,假期的最后一篇博文&a…...