浅析Go 字符串指纹

 更新时间:2020-09-24 15:01:22   作者:佚名   我要评论(0)

写项目时,有时我们需要缓存, 缓存就会需要唯一的key. 常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹.
md5

写项目时,有时我们需要缓存, 缓存就会需要唯一的key. 常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹.

md5 : 一种被广泛使用的密码散列函数,可以产bai生出一个128位(du16字节)的散列值(hash value),用于确保信息传输完整一zhi致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

sha1: SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1基于MD5,MD5又基于MD4。

crc32: 本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。由于CRC32产生校验值时源数据块的每一个bit(位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的CRC32值。

golang 实现

md5

// md5值
func Md5Str(s string) string {
	hash := md5.Sum([]byte(s))
	return hex.EncodeToString(hash[:])
}

sha1

// 散列值
func Sha1Str(s string) string {
	r := sha1.Sum([]byte(s))
	return hex.EncodeToString(r[:])
}

crc32

// String hashes a string to a unique hashcode.
// https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go
// crc32 returns a uint32, but for our use we need
// and non negative integer. Here we cast to an integer
// and invert it if the result is negative.
func HashCode(s string) int {
	v := int(crc32.ChecksumIEEE([]byte(s)))
	if v >= 0 {
		return v
	}
	if -v >= 0 {
		return -v
	}
	// v == MinInt
	return 0
}

// Strings hashes a list of strings to a unique hashcode.
func HashCodes(strings []string) string {
	var buf bytes.Buffer

	for _, s := range strings {
		buf.WriteString(fmt.Sprintf("%s-", s))
	}

	return fmt.Sprintf("%d", HashCode(buf.String()))
}

使用

func main() {
	// 2713056744
	// 1f8689c0dd07ce42757ac01b1ea714f9
	// 9addcbc6fee9c06f43d7110b657f3c61ff707032
	txt := "https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go"
	fmt.Println(HashCode(txt))
	fmt.Println(Md5Str(txt))
	fmt.Println(Sha1Str(txt))
}

效率

得出效率: hash_code > md5 > sha1

const (
	Txt = "https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go"
)

// go test -test.bench=. -test.benchmem
func BenchmarkMd5Str(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Md5Str(Txt)
	}
}
func BenchmarkHashCode(b *testing.B) {
	for i := 0; i < b.N; i++ {
		HashCode(Txt)
	}
}
func BenchmarkSha1Str(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Sha1Str(Txt)
	}
}

// BenchmarkMd5Str-8    2148428        518 ns/op       144 B/op     3 allocs/op
// BenchmarkHashCode-8   8105571        160 ns/op       80 B/op     1 allocs/op
// BenchmarkSha1Str-8    1836854        700 ns/op       176 B/op     3 allocs/op

// 得出效率: hash_code > md5 > sha1

以上就是浅析Go 字符串指纹的详细内容,更多关于Go 字符串指纹的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
  • Golang中的Unicode与字符串示例详解
  • 让Django的BooleanField支持字符串形式的输入方式
  • go浮点数转字符串保留小数点后N位的完美解决方法
  • Go 验证字符串中是否包含中文(推荐)
  • Golang中生成随机字符串并复制到粘贴板的方法
  • 分享6个Go处理字符串的技巧小结
  • Go 高效截取字符串的一些思考
  • Go 结构体、数组、字典和 json 字符串的相互转换方法
  • 简单谈谈Golang中的字符串与字节数组
  • Go语言中的字符串处理方法示例详解
  • Golang字符串的拼接方法汇总
  • Golang 中整数转字符串的方法

相关文章

  • 浅析Go 字符串指纹

    浅析Go 字符串指纹

    写项目时,有时我们需要缓存, 缓存就会需要唯一的key. 常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹. md5
    2020-09-24
  • Shell脚本调用另一个脚本的三种方法

    Shell脚本调用另一个脚本的三种方法

    假如有脚本 first.sh: #!/bin/bash #------------------ #@file:first.sh #------------------ echo 'your are in first file' 如何在其它Shell脚本中调用first
    2020-09-24
  • golang中为什么不存在三元运算符详解

    golang中为什么不存在三元运算符详解

    三元运算符广泛存在于其他语言中,比如: python: val = trueValue if expr else falseValue javascript: const val = expr &#63; trueValue : falseValue
    2020-09-24
  • Shell双引号和单引号有哪些不同

    Shell双引号和单引号有哪些不同

    1.示例 Shell在使用的过程中,经常会使双引号或者单引号将字符串括起来,也可以不使用引号来定义字符串变量。示例如下: str1="testString" //双引号 str2='testS
    2020-09-24
  • 详解使用Python写一个向数据库填充数据的小工具(推荐)

    详解使用Python写一个向数据库填充数据的小工具(推荐)

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据。 而且本次项目是数据统计展示为主要功能,并没有研发对应的
    2020-09-24
  • 区分shell中的 反引号、$()和${}

    区分shell中的 反引号、$()和${}

    1.反引号与$()用于命令替换 反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来,与变量替换差不多。比如
    2020-09-24
  • Visual Studio code 配置Python开发环境

    Visual Studio code 配置Python开发环境

    步骤1:安装 Python 这个直接略过,建议3以上版本。 步骤2:安装 Visual Studio Code 下载地址:https://code.visualstudio.com/ 选择对应的版本,下载安装即可,过
    2020-09-24
  • shell中如何批量注释和取消注释

    shell中如何批量注释和取消注释

    #!/bin/bash echo "1" echo "2" echo "3" echo "4" echo "5" echo "6" 上面这段shell会依次打印1~6 假设我们想只打印5和6,想将1-4注释掉,除了正常的做法,每行
    2020-09-24
  • Linux文本查看命令及其选项详解(cat,head,tail)

    Linux文本查看命令及其选项详解(cat,head,tail)

    linux系统内置命令可以通过以下两种方式查询:“cat --help” 或者“man cat”。 cat命令的常用选项和官方解释如下: cat file_name 显示文件全部内容 cat -b file_
    2020-09-24
  • python 如何调用远程接口

    python 如何调用远程接口

    在python中我们可以使用requests模块来实现调用远程接口 一:安装requests模块 pip install requests 二:使用requests模块实现get方式调用远程接口 使用get方式
    2020-09-24

最新评论